HDU 1272 小希的迷宮

Description

上次Gardon的迷宮城堡小希玩了很久(見Problem B),現在她也想設計一個迷宮讓Gardon來走。但是她設計迷宮的思路不一樣,首先她認爲所有的通道都應該是雙向連通的,就是說如果有一個通道連通了房間A和B,那麼既可以通過它從房間A走到房間B,也可以通過它從房間B走到房間A,爲了提高難度,小希希望任意兩個房間有且僅有一條路徑可以相通(除非走了回頭路)。小希現在把她的設計圖給你,讓你幫忙判斷她的設計圖是否符合她的設計思路。比如下面的例子,前兩個是符合條件的,但是最後一個卻有兩種方法從5到達8。 

 

Input

輸入包含多組數據,每組數據是一個以0 0結尾的整數對列表,表示了一條通道連接的兩個房間的編號。房間的編號至少爲1,且不超過100000。每兩組數據之間有一個空行。 
整個文件以兩個-1結尾。 
 

Output

對於輸入的每一組數據,輸出僅包括一行。如果該迷宮符合小希的思路,那麼輸出"Yes",否則輸出"No"。 
 

Sample Input

6 8 5 3 5 2 6 4 5 6 0 0 8 1 7 3 6 2 8 9 7 5 7 4 7 8 7 6 0 0 3 8 6 8 6 4 5 3 5 6 5 2 0 0 -1 -1
 

Sample Output

Yes Yes

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;
	}
}

發佈了68 篇原創文章 · 獲贊 14 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章