bzoj1006[HNOI2008]神奇的国度

传送门

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

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 

 

posted @ 2018-02-26 21:09  lazytear  阅读(61)  评论(0编辑  收藏