题目链接: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 }
来源:https://www.cnblogs.com/wally/p/3333201.html
