hdu 3478(判断奇环)
题意:给你一个无向图,问你有没有可能存在一个奇环连接所有的节点。
分析:好久没写博客了,这个好习惯还是要继续保持的!这道题通过转化之后就是问你有没有存在一个奇环连接所有的节点,这里用到的方法是染色法,这是一个做题时的技巧,掌握好久ok了!
代码实现:
#include<iostream> #include<cstdio> #include<cstring> #include<vector> #include<queue> using namespace std; vector<int>edge[500005]; int n,m,s,visited[500005]; int solve() { int i,p,x,flag=0; queue<int>Q; memset(visited,0,sizeof(visited)); Q.push(s); visited[s]=1; while(!Q.empty()) { p=Q.front(); Q.pop(); for(i=0;i<edge[p].size();i++) { x=edge[p][i]; if(visited[x]==0) { visited[x]=-visited[p]; Q.push(x); } else if(visited[x]==visited[p])//判断是否形成奇环 flag=1; } } for(i=0;i<n;i++)//判断是否联通所有的节点 if(visited[i]==0) return 0; return flag; } int main() { int i,j,T,t1,t2; scanf("%d",&T); for(j=1;j<=T;j++) { scanf("%d%d%d",&n,&m,&s); for(i=0;i<n;i++) edge[i].clear(); for(i=0;i<m;i++) { scanf("%d%d",&t1,&t2); edge[t1].push_back(t2); edge[t2].push_back(t1); } if(solve()==1) printf("Case %d: YES\n",j); else printf("Case %d: NO\n",j); } return 0; }
posted on 2014-03-12 19:45 后端bug开发工程师 阅读(1151) 评论(0) 编辑 收藏 举报