傳送門:我是傳送門php
上次Gardon的迷宮城堡小希玩了好久(見Problem B),如今她也想設計一個迷宮讓Gardon來走。可是她設計迷宮的思路不同,首先她認爲全部的通道都應該是雙向連通的,就是說若是有一個通道連通了房間A和B,那麼既能夠經過它從房間A走到房間B,也能夠經過它從房間B走到房間A,爲了提升難度,小希但願任意兩個房間有且僅有一條路徑能夠相通(除非走了回頭路)。小希如今把她的設計圖給你,讓你幫忙判斷她的設計圖是否符合她的設計思路。好比下面的例子,前兩個是符合條件的,可是最後一個卻有兩種方法從5到達8。 ios
輸入包含多組數據,每組數據是一個以0 0結尾的整數對列表,表示了一條通道鏈接的兩個房間的編號。房間的編號至少爲1,且不超過100000。每兩組數據之間有一個空行。
整個文件以兩個-1結尾。c++
對於輸入的每一組數據,輸出僅包括一行。若是該迷宮符合小希的思路,那麼輸出」Yes」,不然輸出」No」。spa
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 0code3 8 6 8 6 4
5 3 5 6 5 2 0 0blog-1 -1ci
Yes
Yes
Noget
相比前邊寫的幾個題來講這道題簡單太多了it
只須要在每次新加入兩個點的時候判斷這兩個點是不是不連通的,若是聯通的話說明出現環了,確定不知足題目要求
而後在最後再跑一遍是不是隻存在一個圖(即全部點的父節點在同一集合)
一開始用set提交上去TLE了,常數太大了嗎?
1 /* 2 * ============================================== 3 * 4 * Filename: M.cpp 5 * 6 * Link: http://acm.hdu.edu.cn/showproblem.php?pid=1272 7 * 8 * Version: 1.0 9 * Created: 2018/09/24 02時13分45秒 10 * Revision: none 11 * Compiler: g++ 12 * 13 * Author: 杜寧元 (https://duny31030.top/), duny31030@126.com 14 * Organization: QLU_浪在ACM 15 * 16 * ============================================== 17 */ 18 #include <bits/stdc++.h> 19 using namespace std; 20 #define clr(a, x) memset(a, x, sizeof(a)) 21 #define rep(i,a,n) for(int i=a;i<=n;i++) 22 #define pre(i,a,n) for(int i=n;i>=a;i--) 23 #define ll long long 24 #define max3(a,b,c) fmax(a,fmax(b,c)) 25 #define ios ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0); 26 const double eps = 1e-6; 27 const int INF = 0x3f3f3f3f; 28 const int mod = 1e9 + 7; 29 const int N = 100009; 30 int f[N]; 31 // set<int> s; 32 int find(int x) 33 { 34 // int t = f[x]; 35 if(f[x] != x) 36 { 37 f[x] = find(f[x]); 38 } 39 return f[x]; 40 } 41 42 bool vis[N]; 43 void init() 44 { 45 // s.clear(); 46 47 rep(i,0,N-1) 48 { 49 f[i] = i; 50 vis[i] = 0; 51 } 52 } 53 54 int main() 55 { 56 ios 57 #ifdef ONLINE_JUDGE 58 #else 59 freopen("in.txt","r",stdin); 60 // freopen("out.txt","w",stdout); 61 #endif 62 int x,y; 63 init(); 64 int flag = 0; 65 while(scanf("%d %d",&x,&y)!= EOF) 66 { 67 if(x == y && x < 1) 68 { 69 if(x == -1) 70 break; 71 else 72 { 73 if(flag) 74 { 75 printf("No\n"); 76 } 77 else 78 { 79 int tmp = -1; 80 for(int i = 0;i < N;i++) 81 { 82 if(!vis[i]) continue; 83 if(tmp == -1) tmp = find(i); 84 if(tmp != find(i)) 85 { 86 flag = 1; 87 break; 88 } 89 } 90 91 if(flag) 92 printf("No\n"); 93 else 94 printf("Yes\n"); 95 } 96 init(); 97 flag = 0; 98 continue; 99 } 100 } 101 vis[x] = 1; 102 vis[y] = 1; 103 int fx = find(x); 104 int fy = find(y); 105 if(fx == fy) 106 { 107 flag = 1; 108 } 109 else 110 { 111 f[fx] = fy; 112 } 113 } 114 fclose(stdin); 115 // fclose(stdout); 116 return 0; 117 }