码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-09-10 16:07:49      阅读:181      评论:0      收藏:0      [点我收藏+]

标签:

题目背景:男女相亲图,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-二分图一?二分图判定

标签:

原文地址:http://www.cnblogs.com/0summer/p/5859440.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!