hdu 4751(dfs染色)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4751

思路:构建新图,对于那些两点连双向边的,忽略,然后其余的都连双向边,于是在新图中,连边的点是能不在同一个图中的,于是我们可以用dfs染色的方法来判断是否存矛盾。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<vector>
 6 using namespace std;
 7 
 8 int map[111][111];
 9 int color[111];
10 int n;
11 vector<vector<int> >g;
12 
13 bool dfs(int u,int father,int state)
14 {
15     color[u]=state;
16     for(int i=0;i<g[u].size();i++){
17         int v=g[u][i];
18         if(v==father)continue;
19         if(color[v]&&color[u]==color[v]){
20             return false;
21         }else if(!color[v]&&!dfs(v,u,3-state)){
22             return false;
23         }
24     }
25     return true;
26 }
27 
28 
29 int main()
30 {
31     int x;
32     while(~scanf("%d",&n)){
33         memset(map,0,sizeof(map));
34         memset(color,0,sizeof(color));
35         for(int i=1;i<=n;i++){
36             while(true){
37                 scanf("%d",&x);
38                 if(x==0)break;
39                 map[i][x]=1;
40             }
41         }
42         g.clear();
43         g.resize(n+2);
44         for(int i=1;i<=n;i++){
45             for(int j=i+1;j<=n;j++){
46                 if(map[i][j]&&map[j][i])continue;
47                 g[i].push_back(j);
48                 g[j].push_back(i);
49             }
50         }
51         int flag=1;
52         for(int i=1;i<=n;i++){
53             if(g[i].size()>0&&!color[i]){
54                 if(!dfs(i,i,1)){
55                     flag=0;
56                     break;
57                 }
58             }
59         }
60         flag?puts("YES"):puts("NO");
61     }
62     return 0;
63 }
View Code
原文地址:https://www.cnblogs.com/wally/p/3333201.html