题意:这题难在题意。。
因为题面太尴尬了所以直接转了吧,据说很多写法都能过
有n个点m条边的图,已知有x个点是黄色的,y个点是红色的(最后的x+y行输入的是这些点的编号)
问是否能将这个图转化成二分图,并且满足所有的黄点都在左边,所有的红点都在右边
只不过这题要先从已经有颜色的点开始搜起
#include<stdio.h>
#include<vector>
#include<string.h>
using namespace std;
vector<int> G[1005];
int ok, col[1005];
void Sech(int u)
{
int i, v;
for(i=0;i<G[u].size();i++)
{
v = G[u][i];
if(col[u]==col[v])
ok = 0;
else if(col[v]==-1)
{
col[v] = col[u]^1;
Sech(v);
}
}
}
int main(void)
{
int n, m, i, u, v, x, y;
while(scanf("%d%d%d%d", &n, &m, &x, &y)!=EOF)
{
memset(col, -1, sizeof(col));
for(i=1;i<=n;i++)
G[i].clear();
for(i=1;i<=m;i++)
{
scanf("%d%d", &u, &v);
G[u].push_back(v);
G[v].push_back(u);
}
for(i=1;i<=x;i++)
{
scanf("%d", &u);
col[u] = 1;
}
for(i=1;i<=y;i++)
{
scanf("%d", &v);
col[v] = 0;
}
if(x==0 && y==0)
{
printf("NO\n");
continue;
}
ok = 1;
for(i=1;i<=n;i++)
{
if(col[i]!=-1)
Sech(i);
}
for(i=1;i<=n;i++)
{
if(col[i]==-1)
{
col[i] = 1;
Sech(i);
}
}
if(ok)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}