hdu 3478 Catch(判斷奇數環)
阿新 • • 發佈:2019-02-11
題目大意:
判斷任意時刻,任意一個點是否都可以到達。
解題思路:要讓從起點到任何點,那麼就要判斷是否存在奇數環,如果不存在奇數環,那麼偶數步數的才能到達的點就不符合題目要求,即無解。因此就可以轉變成判斷是否存在奇數環,而如果所有點組成一個奇數環,那麼所有點組成的圖就是一個二分圖,也就是判斷這個圖是否為二分圖,用圖的二染色解即可。
#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");
}
}