http://acm.hdu.edu.cn/showproblem.php?pid=3478
题意:一个贼从s点出发逃跑,下一次他只能移动到相邻(即两点之间有边)的点且下一时刻不能呆在原来的点,问是否在某一时刻,这个贼可以(有可能)到达任一点
分析:这其实是让我们判断这些点能否形成二分图,因为二分图的点是两组,某一时刻只能在一组
其中,我认为应该先判断该图是否连通,如果不连通一定不能到达任意一点(以下代码没有实现,请自行添加)
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
const int NM=100005;
vector<int>ve[NM];
int col[NM],n;
int Color(int v)
{
int j,t,k;
queue<int>q1; //如果图不连通,则一定不满足要求
col[v]=1;
q1.push(v);
while(!q1.empty())
{
t=q1.front();q1.pop();
for(j=0;j<ve[t].size();j++)
{
k=ve[t][j];
if(col[k]==-1)
{
col[k]=1-col[t];
q1.push(k);
}
if(col[k]==col[t]) return false;
}
}
return true;
}
int main()
{
int x,y,i,j,m,s,T;
scanf("%d",&T);
for(j=1;j<=T;j++)
{
scanf("%d%d%d",&n,&m,&s);
memset(ve,0,sizeof(ve));
memset(col,-1,sizeof(col));
for(i=0;i<m;i++)
{
scanf("%d%d",&x,&y);
ve[x].push_back(y);
ve[y].push_back(x);
}
printf("Case %d: ",j);
if(Color(s)) printf("NO\n");
else printf("YES\n");
}
return 0;
}