**************************************************************
Problem: 1006
User: y20070316
Language: C++
Result: Accepted
Time:848 ms
Memory:28960 kb
****************************************************************/
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <queue>
using namespace std;
const int N=10001;
const int M=1000001;
struct G
{
int v,nxt;
}map[M+M];
int tt,hd[N]; //Graph
int lab[N],tid[N],seq[N];
int color[N],r[N],colornum;
int n,m;
struct node
{
int w,id;
friend bool operator<(node a,node b)
{
return a.w<b.w;
}
};
priority_queue<node> q;
inline int read(void)
{
int s=0,f=1; char c=getchar();
for (;c<'0'||c>'9';c=getchar());
for (;'0'<=c&&c<='9';c=getchar()) s=s*10+c-48;
return s*f;
}
inline void ins(int u,int v)
{
map[++tt].v=v;
map[tt].nxt=hd[u];
hd[u]=tt;
}
void init_graph(void)
{
int x,y;
n=read(),m=read();
for (int i=1;i<=m;i++)
{
x=read(),y=read();
ins(x,y),ins(y,x);
}
}
void get_queue(void)
{
node t;
for (int i=1;i<=n;i++)
{
t.id=i,t.w=lab[i];
q.push(t);
}
for (int num=n;num>0;num--)
{
for (;!q.empty();)
{
t=q.top(),q.pop();
if (!tid[t.id]) break;
}
seq[num]=t.id,tid[t.id]=num;
for (int k=hd[t.id];k;k=map[k].nxt)
if (!tid[map[k].v])
{
lab[map[k].v]++;
t.id=map[k].v;
t.w=lab[map[k].v];
q.push(t);
}
}
}
void color_graph(void)
{
int now;
for (int num=n;num>0;num--)
{
now=seq[num];
for (int k=hd[now];k;k=map[k].nxt)
if (tid[map[k].v]>num) r[color[map[k].v]]=now;
int d=0;
for (int k=1;k<=colornum;k++)
if (r[k]^now)
{
color[now]=k;
d=1; break;
}
if (!d) color[now]=++colornum;
}
printf("%d\n",colornum);
}
int main(void)
{
init_graph();
get_queue();
color_graph();
return 0;
}</span>
[Code]链表
<span style="font-size:18px;">/**************************************************************
Problem: 1006
User: y20070316
Language: C++
Result: Accepted
Time:484 ms
Memory:24596 kb
****************************************************************/
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <queue>
using namespace std;
const int N=10001;
const int M=1000001;
struct G
{
int v,nxt;
}map[M+M];
int tt,hd[N]; //Graph
int lab[N],tid[N],seq[N];
int color[N],r[N],colornum;
int n,m;
G list[N+M]; int mxf,lhd[N],tl; //List for MCS
inline int read(void)
{
int s=0,f=1; char c=getchar();
for (;c<'0'||c>'9';c=getchar());
for (;'0'<=c&&c<='9';c=getchar()) s=s*10+c-48;
return s*f;
}
inline void insg(int u,int v)
{
map[++tt].v=v;
map[tt].nxt=hd[u];
hd[u]=tt;
}
void init_graph(void)
{
int x,y;
n=read(),m=read();
for (int i=1;i<=m;i++)
{
x=read(),y=read();
insg(x,y),insg(y,x);
}
}
inline void inslist(int floor,int id)
{
list[++tl].v=id;
list[tl].nxt=lhd[floor];
lhd[floor]=tl;
}
void get_queue(void)
{
int now;
for (int i=1;i<=n;i++) inslist(lab[i],i);
for (int num=n;num>0;num--)
{
for (;tid[list[lhd[mxf]].v];)
{
lhd[mxf]=list[lhd[mxf]].nxt;
if (!lhd[mxf]) mxf--;
}
now=list[lhd[mxf]].v; lhd[mxf]=list[lhd[mxf]].nxt;
for (;!lhd[mxf];) mxf--;
tid[now]=num,seq[num]=now;
for (int k=hd[now];k;k=map[k].nxt)
if (!tid[map[k].v])
{
lab[map[k].v]++;
if (lab[map[k].v]>mxf) mxf=lab[map[k].v];
inslist(lab[map[k].v],map[k].v);
}
}
}
void color_graph(void)
{
int now;
for (int num=n;num>0;num--)
{
now=seq[num];
for (int k=hd[now];k;k=map[k].nxt)
if (tid[map[k].v]>num) r[color[map[k].v]]=now;
int d=0;
for (int k=1;k<=colornum;k++)
if (r[k]^now)
{
color[now]=k;
d=1; break;
}
if (!d) color[now]=++colornum;
}
printf("%d\n",colornum);
}
int main(void)
{
init_graph();
get_queue();
color_graph();
return 0;
}版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/u013598409/article/details/47010633