二部圖(二分圖判定--dfs)


題目鏈接:二部圖

二部圖

時間限制: 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 }

 


免責聲明!

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



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