[BZOJ1006]神奇的国度

安利论文 《弦图与区间图》---cdq

任意一个长度>3的环都有弦(即非连接相邻点的边),满足弦图的性质,对弦图进行最小染色

然而并不能想得明白,维萨最小染色是从从后往前,最大独立集是从前往后...

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define maxn 10005
 4 #define maxm 1000005
 5 int cnt,v[maxm<<1],next[maxm<<1],first[maxn];
 6 int lab[maxn],vis[maxn],se[maxn],used[maxn],col[maxn];
 7 void add(int st,int end){
 8     v[++cnt]=end;
 9     next[cnt]=first[st];
10     first[st]=cnt;
11 }
12 int main(){
13     int n,m,a,b;
14     scanf("%d%d",&n,&m);
15     for(int i=1;i<=m;i++){
16         scanf("%d%d",&a,&b);
17         add(a,b),add(b,a);
18     }
19     for(int i=n;i;i--){
20         int pos=0;
21         for(int j=1;j<=n;j++)
22             if(!vis[j]&&lab[j]>=lab[pos])pos=j;
23         vis[pos]=1;
24         se[i]=pos;
25         for(int e=first[pos];e;e=next[e])
26             lab[v[e]]++;
27     }
28     int ans=0;
29     for(int i=n;i;i--){
30         for(int e=first[se[i]];e;e=next[e])
31             used[col[v[e]]]=se[i];
32         int j=1;
33         while(used[j]==se[i])j++;
34         col[se[i]]=j;
35         if(j>ans)ans=j;
36     }
37     printf("%d
",ans);
38     return 0;
39 }
View Code
原文地址:https://www.cnblogs.com/Ngshily/p/5077951.html