二分圖判定--黑白染色


首先,二分圖又叫二部圖,特點是所有點分成兩半,每一半內的點之間沒有邊相連,只有兩半之間會有邊相連,圖內無奇環,當然,單點圖或者有單點的圖也屬於二分圖,因此最主要的區分就是圖內無奇環了。對於一個圖,是否是二分圖,常用的方法是黑白染色,由於給定圖常常不完全連通,所以只要對於每一個還未標記過的點,從它開始DFS按照黑白相間的方法標記顏色(0/1),每次DFS操作就是將這一連通塊內按黑白分成兩半,若途中遇到需要然成某種顏色但已經標記為另一種顏色時,則表明出現了奇環,不能構成二分圖。而要注意,每次DFS只是將一個連通塊分成黑白兩半,但不是同一次的DFS得到的黑白點之間並沒有關系。

 

 1 #include<stdio.h>
 2 #include<string.h>
 3 
 4 const int maxn=1e5+5;  5 const int maxm=1e5+5;  6 
 7 int head[maxn],point[maxm<<1],nxt[maxm<<1],size;  8 int c[maxn];            //color,每個點的黑白屬性,-1表示還沒有標記,0/1表示黑白
 9 int num[2];                //在一次DFS中的黑白點個數
10 bool f=0;                //判斷是否出現奇環
11 
12 void init(){ 13     memset(head,-1,sizeof(head)); 14     size=0; 15     memset(c,-1,sizeof(c)); 16 } 17 
18 void add(int a,int b){ 19     point[size]=b; 20     nxt[size]=head[a]; 21     head[a]=size++; 22     point[size]=a; 23     nxt[size]=head[b]; 24     head[b]=size++; 25 } 26 
27 void dfs(int s,int x){ 28     if(f)return; 29     c[s]=x; 30     num[x]++; 31     for(int i=head[s];~i;i=nxt[i]){ 32         int j=point[i]; 33         if(c[j]==-1)dfs(j,!x); 34         else if(c[j]==x){ 35             f=1; 36             return; 37  } 38  } 39 } 40 //下面是主函數內的調用過程
41 
42 for(i=1;i<=n&&(!f);i++){ 43     if(c[i]==-1){ 44         num[0]=num[1]=0; 45         dfs(i,1); 46  } 47 }

 


免責聲明!

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



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