1. 程式人生 > >hdu 3478 Catch(判斷奇數環)

hdu 3478 Catch(判斷奇數環)

題目大意:
判斷任意時刻,任意一個點是否都可以到達。

解題思路:要讓從起點到任何點,那麼就要判斷是否存在奇數環,如果不存在奇數環,那麼偶數步數的才能到達的點就不符合題目要求,即無解。因此就可以轉變成判斷是否存在奇數環,而如果所有點組成一個奇數環,那麼所有點組成的圖就是一個二分圖,也就是判斷這個圖是否為二分圖,用圖的二染色解即可。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int maxn=1000005
; vector<int>g[maxn]; int n,m,s,vis[maxn]; bool bfs() { int blag=0; queue<int>q; memset(vis,0,sizeof(vis)); q.push(s); vis[s]=1; while(!q.empty()) { int u=q.front(); q.pop(); for(int i=0;i<g[u].size();i++) { int v=g[u][i]; if
(vis[v]==0) { vis[v]=-vis[u]; q.push(v); } else if(vis[v]==vis[u]) blag=1; } } for(int i=0;i<n;i++) if(vis[i]==0) return false; return blag; } int main() { int t,tt=1,u,v; scanf
("%d",&t); while(t--) { scanf("%d%d%d",&n,&m,&s); for(int i=0;i<n;i++) g[i].clear(); while(m--) { scanf("%d%d",&u,&v); g[u].push_back(v); g[v].push_back(u); } printf("Case %d: %s\n",tt++,bfs()?"YES":"NO"); } }