1. 程式人生 > >bzoj1006[HNOI2008]神奇的國度

bzoj1006[HNOI2008]神奇的國度

noi2008 ans 存在 方案 hint href sin tdi pos

傳送門

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

bzoj1006[HNOI2008]神奇的國度