************************************************************** 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