Description
Input
整個文件以兩個-1結尾。
Output
Sample Input
Sample Output
No
這道題需要用到並查集,對於所有的邊,2個端點僅能加入集合一次,所以如果一條邊的2個頂點在遍歷之前就加入集合的話,就表明有第二條路,也就是輸出no。只輸入"0 0 "的時候,條件符合,需要輸出yes。接着需要判斷該圖是否是連通圖,只需要邊的數目等於頂點數-1即可。
#include <iostream>
#include <set>
#include <vector>
using namespace std;
int f[120000];
struct coord {
int a, b;
};
int research(int a)
{
if (f[a] == a)
return a;
else
return f[a] = research(f[a]);
}
void getin(int a, int b)
{
int t1 = research(a);
int t2 = research(b);
if (t1 != t2)
f[t1] = t2;
}
int main()
{
while (true)
{
coord k;
int i = 0;
bool flag = false;
set<int> s;
vector<coord> n;
while (true)
{
cin >> k.a >> k.b;
if (k.a == 0 && k.b == 0 || k.a == -1 && k.b == -1)
break;
n.push_back(k);
s.insert(k.a);
s.insert(k.b);
}
if (k.a == -1 && k.b == -1)
break;
if (n.size() == 0)
{
cout << "Yes" << endl;
continue;
}
for (set<int>::iterator its = s.begin(); its != s.end(); its++)
{
f[*its] = *its;
//cout << f[*its] << endl;
}
for (vector<coord>::iterator it = n.begin(); it != n.end(); it++)
{
if (research(it->a) != research(it->b))
{
getin(it->a, it->b);
i++;
}
else
flag = true;
}
//for (set<int>::iterator its = s.begin(); its != s.end(); its++)
//cout << f[*its] << endl;
if (i != s.size() - 1)
flag = true;
if (flag)
cout << "No" << endl;
else
cout << "Yes" << endl;
}
}