hdu 3478 Catch--二分图判断

时间:2020-12-08 21:07:21

我觉得,给了初始点的话用bfs方便点,没有则dfs ||可能超片面

https://vjudge.net/contest/281085?tdsourcetag=s_pcqq_aiomsg#problem/C

 #include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<stdlib.h>
#include<algorithm>
#include<queue>
#include<vector>
#include<string>
#include<set>
#include<cctype>
#include<sstream>
#define mem(a) memset(a,0,sizeof(a))
#define LL long long
#define inf 0x3f3f3f3f
using namespace std;
const int N=1e5+;
int color[N],fa[N];
int n,m,now;
vector<int> link[N];
queue<int> q;
int bfs()
{
memset(color,-,sizeof(color));
color[now]=;
while(!q.empty())
{
int k=q.front();
q.pop();
for(size_t i=;i<link[k].size();i++)
{
int t=link[k][i]; //表示定点k通过i边连接的点
if(color[t]==color[k]) //染色是否相同
return ;
if(color[t]==-)
{
q.push(t);
color[t]=-color[k];//1||0
}
}
}
return ;
}
int main()
{
int a,b,t;
scanf("%d",&t);
for(int i=;i<=t;i++)
{
scanf("%d%d%d",&n,&m,&now); for(int j=;j<n;j++)
link[j].clear(); for(int j=;j<m;j++)
{
scanf("%d %d",&a,&b);
link[a].push_back(b);
link[b].push_back(a);
} while(!q.empty())
q.pop(); q.push(now); if(!bfs()) //不是二分图,输出yes
printf("Case %d: NO\n",i);
else
printf("Case %d: YES\n",i);
}
return ;
}