染色法判斷二分圖
二分圖:
一個無向圖,使得頂點集V可以分割為兩個互不相交的子集A,B,使得所有邊兩端分別屬於兩個子集A,B。
要判斷二分圖,要分兩種情況,一種是聯通圖,一種是非連通圖,兩者都不難。
大致思路就是先找到一個沒被染色的節點u,把它染上一種顏色,之后遍歷所有與它相連的節點v,如果節點v已被染色並且顏色和節點u一樣,那么就失敗了。如果這個節點v沒有被染色,先把它染成與節點u不同顏色的顏色,然后遍歷所有與節點v相連的節點............就這樣循環下去,直到結束為止。
連通圖代碼:

1 #include<cstdio> 2 #include<algorithm> 3 #define N 42000 4 int next[N],to[N],num,head[N],col[N],flag,n,m,a,b; 5 void add(int false_from,int false_to){ 6 next[++num]=head[false_from]; 7 to[num]=false_to; 8 head[false_from]=num; 9 } 10 void dfs(int x,int color){ 11 col[x]=color; 12 for(int i=head[x];i;i=next[i]){ 13 if(col[to[i]]==col[x]){ 14 printf("NO"); 15 flag=1; 16 exit(0); 17 } 18 if(!col[to[i]]) 19 dfs(to[i],-color); 20 } 21 } 22 int main(){ 23 scanf("%d%d",&n,&m); 24 for(int i=1;i<=m;++i){ 25 scanf("%d%d",&a,&b); 26 add(a,b); 27 add(b,a); 28 } 29 dfs(1,1); 30 if(!flag) 31 printf("YES"); 32 return 0; 33 }
非連通圖代碼:

1 #include<cstdio> 2 #include<algorithm> 3 #define N 42000 4 int next[N],to[N],num,head[N],col[N],flag,n,m,a,b; 5 void add(int false_from,int false_to){ 6 next[++num]=head[false_from]; 7 to[num]=false_to; 8 head[false_from]=num; 9 } 10 void dfs(int x,int color){ 11 col[x]=color; 12 for(int i=head[x];i;i=next[i]){ 13 if(col[to[i]]==col[x]){ 14 printf("NO"); 15 flag=1; 16 exit(0); 17 } 18 if(!col[to[i]]) 19 dfs(to[i],-color); 20 } 21 } 22 int main(){ 23 scanf("%d%d",&n,&m); 24 for(int i=1;i<=m;++i){ 25 scanf("%d%d",&a,&b); 26 add(a,b); 27 add(b,a); 28 } 29 for(int i=1;i<=n&&!flag;++i) 30 if(!col[i]) 31 dfs(i,1); 32 if(!flag) 33 printf("YES"); 34 return 0; 35 }
后記:本來都搞過這東西了,然而培訓時聽某清北奆佬講到這,以為要搞更diao的東西,於是一激動就把原來那篇給刪了,盡管補一篇不難,但是.........................................................