二分圖的判斷——染色法


染色法判斷二分圖

二分圖:

一個無向圖,使得頂點集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 }
View Code

非連通圖代碼:

 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 }
View Code

后記:本來都搞過這東西了,然而培訓時聽某清北奆佬講到這,以為要搞更diao的東西,於是一激動就把原來那篇給刪了,盡管補一篇不難,但是.........................................................

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM