題目鏈接:二部圖
二部圖
時間限制:
1000 ms | 內存限制:65535 KB
難度:
1
- 描述
-
二 部圖又叫二分圖,我們不是求它的二分圖最大匹配,也不是完美匹配,也不是多重匹配,而是證明一個圖是不是二部圖。證明二部圖可以用着色來解決,即我們可以 用兩種顏色去塗一個圖,使的任意相連的兩個頂點顏色不相同,切任意兩個結點之間最多一條邊。為了簡化問題,我們每次都從0節點開始塗色
- 輸入
-
輸入:
多組數據
第一行一個整數 n(n<=200) 表示 n個節點
第二行一個整數m 表示 條邊
隨后 m行 兩個整數 u , v 表示 一條邊 - 輸出
- 如果是二部圖輸出 BICOLORABLE.否則輸出 NOT BICOLORABLE.
- 樣例輸入
-
3 3 0 1 1 2 2 0 3 2 0 1 0 2
- 樣例輸出
-
NOT BICOLORABLE. BICOLORABLE.
二分圖定義:有兩頂點集且圖中每條邊的的兩個頂點分別位於兩個頂點集中,每個頂點集中沒有邊相連接!判斷二分圖的常見方法:開始對任意一未染色的頂點染色,之后判斷其相鄰的頂點中,若未染色則將其染上和相鄰頂點不同的顏色, 若已經染色且顏色和相鄰頂點的顏色相同則說明不是二分圖,若顏色不同則繼續判斷。
錯誤代碼我也要貼出來,因為wa了十幾次了,讓司老大看也看不出毛病,求大牛指導。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<vector> 6 using namespace std; 7 const int maxn = 205; 8 int color[maxn]; 9 vector<int> g[maxn]; 10 int n,m; 11 bool dfs(int u,int c){ 12 color[u] = c; 13 for(int i = 0; i<g[u].size(); i++){ 14 if(color[g[u][i]] == c) return false; 15 if(color[g[u][i]] == 0 && !dfs(g[u][i],-c)) return false; 16 } 17 return true; 18 } 19 void solve(){ 20 while(scanf("%d%d",&n,&m)!=EOF){ 21 int x,y; 22 for(int i = 1; i<=m; i++){ 23 scanf("%d%d",&x,&y); 24 g[x].push_back(y); 25 g[y].push_back(x); 26 } 27 int flag = 0; 28 for(int i = 0; i<n; i++){ 29 if(color[i] == 0){ 30 if(!dfs(i,1)){ 31 flag = 1; 32 break; 33 } 34 } 35 } 36 if(flag) printf("NOT BICOLORABLE.\n"); 37 else printf("BICOLORABLE.\n"); 38 memset(color,0,sizeof(color)); 39 for(int i = 0; i<=n; i++) g[i].clear(); 40 } 41 } 42 int main() 43 { 44 solve(); 45 return 0; 46 }