您的位置:首页 > 其它

hihocoder1121 二分图一•二分图判定

2017-06-03 21:12 232 查看

染色(模拟)

题目传送门

图的染色(就是二分图判定的方法),思路题目上直接有就不讲了。

注意可能有多个联通分量。

贴上交了8遍才过的代码(还是8遍):

#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAXN 10000
using namespace std;
struct edge{
int to;
int next;
};
int k,t,n,m,u,v,r,w;
edge a[MAXN*8+5];
int h[MAXN+5];
int f[MAXN+5];
int b[MAXN*10+5];
bool pd;
void read(int x,int y)
{
k++;
a[k].next=h[x];
a[k].to=y;
h[x]=k;
}
void doit(int j)
{
b[1]=j; f[j]=1;
r=0; w=1; int x;
while (r<w)
{
x=b[++r];
if (f[x]==1)
for (int i=h[x];i!=0;i=a[i].next)
{
if (!f[a[i].to])
{
f[a[i].to]=2;
b[++w]=a[i].to;
}
else
if (f[a[i].to]==1)
{
printf("Wrong\n");
pd=true;
return;
}
}
else
for (int i=h[x];i!=0;i=a[i].next)
{
if (!f[a[i].to])
{
f[a[i].to]=1;
b[++w]=a[i].to;
}
else
if (f[a[i].to]==2)
{
printf("Wrong\n");
pd=true;
return;
}
}
}
}
int main()
{
scanf("%d",&t);
while (t--)
{
memset(h,0,sizeof(h));
memset(f,0,sizeof(f));
k=0;
pd=false;
scanf("%d%d",&n,&m);
for (int i=1;i<=m;i++)
{
scanf("%d%d",&u,&v);
read(u,v);
read(v,u);
}
for (int j=1;j<=n;j++)
{
if (!f[j])
doit(j);
if (pd)
break;
}
if (pd==false)
printf("Correct\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: