Description
K国是一个热衷三角形的国度,连人的交往也只喜欢三角原则.他们认为三角关系:即AB相互认识,BC相互认识,CA
相互认识,是简洁高效的.为了巩固三角关系,K国禁止四边关系,五边关系等等的存在.所谓N边关系,是指N个人 A1A2
...An之间仅存在N对认识关系:(A1A2)(A2A3)...(AnA1),而没有其它认识关系.比如四边关系指ABCD四个人 AB,BC,C
D,DA相互认识,而AC,BD不认识.全民比赛时,为了防止做弊,规定任意一对相互认识的人不得在一队,国王相知道,
最少可以分多少支队。
Input
第一行两个整数N,M。1<=N<=10000,1<=M<=1000000.表示有N个人,M对认识关系. 接下来M行每行输入一对朋
友
Output
输出一个整数,最少可以分多少队
Sample Input
4 5
1 2
1 4
2 4
2 3
3 4
1 2
1 4
2 4
2 3
3 4
Sample Output
3
HINT
一种方案(1,3)(2)(4)
题解:
弦图的最小点染色,传说这是一道论文题,好像只能在cdq论文《弦图与区间图》里看,讲道理我也不怎么会。
代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cstring> 5 #include<algorithm> 6 #include<cmath> 7 #define maxm 2000010 8 #define maxn 10010 9 using namespace std; 10 struct node{ 11 int to,next; 12 }e[maxm]; 13 int head[maxn],dis[maxn],q[maxn],col[maxn],hash[maxn]; 14 bool vis[maxn]; 15 int n,m,cnt=1,ans; 16 void add(int u,int v){ 17 e[++cnt].to=v;e[cnt].next=head[u];head[u]=cnt; 18 e[++cnt].to=u;e[cnt].next=head[v];head[v]=cnt; 19 } 20 int main(){ 21 scanf("%d%d",&n,&m); 22 int i,j,x,y; 23 for(i=1;i<=m;++i){ 24 scanf("%d%d",&x,&y); 25 add(x,y); 26 } 27 for(i=n;i>=1;--i){ 28 int t=0; 29 for(j=1;j<=n;++j){ 30 if(!vis[j] && dis[j]>=dis[t]) t=j; 31 } 32 vis[t]=1;q[i]=t; 33 for(j=head[t];j;j=e[j].next){ 34 dis[e[j].to]++; 35 } 36 } 37 for(i=n;i>=1;--i){ 38 int x=q[i]; 39 for(j=head[x];j;j=e[j].next){ 40 hash[col[e[j].to]]=i; 41 } 42 int k=1; 43 for(k=1;;k++) if(hash[k]!=i) break ; 44 col[x]=k; 45 if(k>ans) ans=k; 46 } 47 printf("%d\n",ans); 48 return 0; 49 } 50