弦图染色详细见论文http://wenku.baidu.com/view/6f9f2223dd36a32d73758126.html
本人用的是CMS;
先从n开始降序记录出场顺序,记住CMS里每次从n降序出现的,都是出场顺序。
本人也是借鉴了他人的程序才AC的。。。
不过仔细研究一下论文就差不多了。
#include<algorithm>
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
const int maxn=10000;
int f[maxn+50],col[maxn+50],label[maxn+50],q[maxn+50],p[maxn+50];
vector<int> g[maxn+50];
void ins(int x,int y)
{
g[x].push_back(y);
return ;
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=0;i<=n;i++)
g[i].clear();
int x,y;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
ins(x,y);
ins(y,x);
}
memset(q,0,sizeof(q));
memset(label,0,sizeof(label));
memset(p,0,sizeof(p));
for(int i=n;i>0;i--)
{
int m=0,k=1;
for(int j=1;j<=n;j++)
{
if(p[j]==0 && label[j]>m)
{
m=label[j];
k=j;
}
}
p[k]=1;
q[i]=k;
for(int j=0;j<g[k].size();j++)
{
label[g[k][j]]++;
}
}
memset(f,0,sizeof(f));
memset(col,0,sizeof(col));
int ans=0;
for(int i=n;i>0;i--)
{
for(int j=0;j<g[q[i]].size();j++)
{
f[col[g[q[i]][j]]]=i;
}
int j;
for(j=1;j<=n;j++) if(f[j]!=i) break;
col[q[i]]=j;
ans=max(ans,j);
}
printf("%d",ans);
return 0;
}