这题,可以用并查集来解决。需要用到两个数组来判断从i到j以及j到i的是否属于同一个并查集。
下面的是AC的代码:
#include <iostream>
#include <cstdio>
using namespace std;
int par[2][10005];
int n, m;
int finds(int x, int i)
{
if(x == par[i][x])
return x;
else
return par[i][x] = finds(par[i][x], i);
}
void join(int x, int y) //并查集合并
{
if(x != n) //没有包含第n个放间的两个房间,在0和1的地方都要合并,包含n的特殊处理
{
x = finds(x, 0);
y = finds(y, 0);
if(x != y)
par[0][x] = y;
}
if(y != n)
{
x = finds(x, 1);
int fy = finds(y, 1);
if(x != y)
par[1][y] = x;
}
}
int main()
{
int a, b;
while(scanf("%d%d", &n, &m) != EOF && m + n != 0)
{
for(int j = 0; j <= n; j++)
par[0][j] = par[1][j] = j;
for(int i = 0; i < m; i++)
{
scanf("%d%d", &a, &b);
join(a, b);
}
int flag = 0;
for(int k = 1; k <= n; k++) //并查集合并之后,都是属于第n个,所以判断是否等于n
{
if(finds(k, 0) != n || finds(k, 1) != n)
{
flag = 1;
break;
}
}
if(flag)
cout << "No" << endl;
else
cout << "Yes" << endl;
}
return 0;
}