HDU 1272 小希的迷宮(簡單並查集)

描述

傳送門:我是傳送門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 0code

3 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 }
相關文章
相關標籤/搜索