hihocoder-1121-二分图一?二分图判定

Posted 0_summer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hihocoder-1121-二分图一?二分图判定相关的知识,希望对你有一定的参考价值。

题目背景:男女相亲图,n个点m条边,数据范围n<=10000,m<=40000,判断输入的数据是否满足任意一条边的两个端点分别为男和女

分析:简单二分图,选择一个端点开始染色,我的做法是vis[i]=-1然后从i点出发的边的另一个端点都染成vis[j]=1,初始化memset(vis,0,sizeof(vis))表示所有端点还没有被染色

深搜,或者说递归,从一个端点开始染色:

1.如果与他相连的另一个端点还没染色就染成与他相反的颜色,且递归这个端点

2.如果与他相连的另一个端点已经染色,且和他相同直接返回false

注意:递归不能直接vis[1]=-1;return dfs(1);因为这个图可能不是连通的,所以要用一个for循环来寻找还没被染色的端点,然后开始递归

 1 #include<iostream>
 2 #include<vector>
 3 #include<cstring>
 4 #include<string>
 5 #include<algorithm>
 6 using namespace std;
 7 
 8 int t,n,m;
 9 vector<vector<int> > v;
10 int vis[10005];
11 
12 bool dfs(int x)
13 {
14     for(int i=0;i<v[x].size();i++){
15         int y=v[x][i];
16         if(!vis[y]){
17             vis[y]=-vis[x];
18             if(!dfs(y)) return false;
19         }
20         else if(vis[y]==vis[x]) return false;
21     }
22     return true;
23 }
24 
25 int main()
26 {
27     cin>>t;
28     while(t--){
29         cin>>n>>m;
30         v.clear();
31         v.resize(n+1);
32         memset(vis,0,sizeof(vis));
33         while(m--){
34             int x,y;
35             cin>>x>>y;
36             v[x].push_back(y);
37             v[y].push_back(x);
38         }
39         int ok=1;
40         for(int i=1;i<=n;i++){
41             if(!vis[i]){
42                 vis[i]=-1;
43                 if(!dfs(i)){
44                     ok=0;
45                     break;
46                 }
47             }
48         }
49         if(ok) cout<<"Correct"<<endl;
50         else cout<<"Wrong"<<endl;
51     }
52 }

 

以上是关于hihocoder-1121-二分图一?二分图判定的主要内容,如果未能解决你的问题,请参考以下文章

hihocoder -1121-二分图的判定

hihoCoder - 1121 - 二分图判定

图论之二分图-HihoCoder1121

Hihocoder 二分图一·二分图判定

HiHo1121 : 二分图一?二分图判定(模板题)

二分图判定