题目链接: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