#include <iostream>
int vid[100001];
int m, n;
bool flag = false;
using namespace std;
int find(int root)
{
if (vid[root] != root) vid[root]=find(vid[root]);
else return vid[root];
}
int main()
{
while (cin >> m >> n)
{
if (!m && !n)
{
cout << "YES" << endl;
continue;
}
if (n < 0 && m < 0) break;
flag = false;
vid[m] = m;
vid[n] = m;
while (cin >> m >> n)
{
if (!m && !n) break;
if (vid[m] == 0 && vid[n] == 0)
{
vid[m] = m;
vid[n] = m;
}
else if (vid[m] == 0 && vid[n] != 0)
{
vid[m] = find(n);
}
else if (vid[m] != 0 && vid[n] == 0)
{
vid[n] = find(m);
}
else
{
int fm = find(m), fn = find(n);
if (fm == fn)
{
flag = true;
}
else if (fm != fn)
{
vid[fm] = fn;
}
}
}
if (!flag)
{
int temp = 0;
for (int i = 1; i <= 100000; i++) //判断连通
{
if (vid[i] == 0) continue;
if (!flag) {
if (!temp) temp = find(i);
else {
if (temp != find(i)) flag = true;
}
}
}
}
for (int i = 1; i <= 100000; i++) {
vid[i] = 0;
}
if (flag) cout << "NO" << endl;
else cout << "YES" << endl;
}
return 0;
}
HDU1272 并查集
最新推荐文章于 2024-08-05 15:41:47 发布