这道题可以用并查集来实现,题目意思非常明确,给你一张图让你判断是否有环。
这题比较坑的一个地方在如果一开始就是输入0 0,那么要输出Yes。
#include<iostream>
#include<fstream>
using namespace std;
int p[100100];
bool isappear[100100];
bool isout=false;
int t = 1;
void init()
{
for (int i = 0; i < 100100; i++)
p[i] = i;
memset(isappear, 0, sizeof(isappear));
t = 1;
isout = false;
}
int findroot(int x)
{
int root = x;
while (p[root] != root)
root = p[root];
int i = x, j;
while (p[i] != root)
{
j = p[i];
p[i] = root;
i = j;
}
return root;
}
bool merge(int x, int y)
{
int fx = findroot(x), fy = findroot(y);
if (fx != fy)
{
p[fx] = fy;
return true;
}
return false;
}
int main()
{
int m, n;
init();
ifstream fin("fin.txt");
while (/*scanf_s("%d%d", &m, &n)*/cin>>m>>n)
{
if (m + n==0)
{
if (t == 1)
{
cout << "Yes" << endl;
init();
continue;
}
if (isout)
{
init();
continue;
}
for (int i = 0; i < 100100; i++)
{
if (isappear[i])
{
findroot(i);
}
}
bool flag = true;
int rootvalue = 0;
for (int i = 0; i < 100100; i++)
{
if (isappear[i]&&flag)
{
rootvalue = p[i];
flag = false;
}
if (!flag&&isappear[i])
{
if (rootvalue != p[i])
{
cout << "No" << endl;
flag = true;
break;
}
}
}
if (!flag)
cout << "Yes" << endl;
init();
continue;
}
if (m + n == -2)
{
break;
}
isappear[m] = true;
t++;
isappear[n] = true;
if (!merge(m, n)&&!isout)
{
cout << "No" << endl;
isout = true;
}
}
}