HDU 1272 小希的迷宮 (水題)

2022-05-16 16:15:16 字數 1720 閱讀 9085

題意:

其實就是讓你判斷乙個圖是否為樹,要求不能有孤立的點(沒有這中情況),且只能有1個連通圖,且邊數+1=點數,且每個點都有邊(不可能只有1個點出現)。

思路:有可能出現連續的4個0,也就是有測試例子是完全沒有點的,也沒有邊,要列印yes!記錄下所有點(去重),記錄下每個點的度數,如果有n個點,n-1條邊,且每點都是有邊連著的,再判斷其只有乙個連通圖就行了。因為只有n-1條邊,所以當只有乙個連通圖時,必不會有環的產生。

判斷是否只有乙個連通圖的方法:

(1)bfs(可用)

(2)dfs(有10萬點,可能爆棧)

(3)並查集(可用)

(4)prim、kruscal生成乙個樹,所有點和所有邊都要用上。

(5)dijkstra、bellman-ford  求單點到其他點的路徑長,如果有兩點的路徑為無窮則證明有點不可達。

1 #include 2

using

namespace

std;

3const

int n=100005;4

const

int mod=0x7f7f7f7f;5

intnum[n];6/*

7僅僅靠邊數+點數來斷定是否為樹,應該是錯的。測試資料:

81 2 3 4

93 5 4 5

100 0

11*/

12int

main()

1327

if(!num[b])

2832 cnt++; //

邊數33}34

if(a==-1 && b==-1) break;35

if(!cnt||cnt+1==siz) printf("

yes\n");

36else printf("

no\n");

3738}39

return0;

40 }

ac的錯誤**

1 #include 2

using

namespace

std;

3const

int n=100005, mod=0x7f7f7f7f

;將點編號對映到從1開始的連續的編號

5int

pre[n];

6int find(int a) //查7

18return

tmp;19}

2021

void joint(int a,int b) //並22

2728

void init() //

初始化pre,不知道點個數,所以只能這樣了

2932

33int istree(int n) //

每個房間都是連著的

3439

40int

main()

4160

if(a==-1 || b==-1) break;61

62if(!cnt) printf("

yes\n

"); //坑63

else

if(cnt+1!=j) printf("

no\n

");//

邊多了肯定不行

64else

6569}70

return0;

71 }

ac**(並查集實現)

HDU 1272 小希的迷宮

description 上次gardon的迷宮城堡小希玩了很久 見problem b 現在她也想設計乙個迷宮讓gardon來走。但是她設計迷宮的思路不一樣,首先她認為所有的通道都應該是雙向連通的,就是說如果有乙個通道連通了房間a和b,那麼既可以通過它從房間a走到房間b,也可以通過它從房間b走到房間a...

Hdu 1272 小希的迷宮

並查集 1.輸入的時候進行合併。當前讀入的兩個點如果屬於乙個集合,肯定輸出no。2.判斷一下是否有孤立點。3.當輸入0 0時,輸出yes。ac include include include include include using namespace std const int room 100...

hdu 1272 小希的迷宮

並查集判斷給出的圖是否是樹 判斷是否有環 未給出點數判斷集合數是否大於1 判斷有環 若輸入兩點的根相同則有環 判斷所有點是否都在同一集合內 合併過程中把出現的點都標記,把最小和最大的找到,列舉在該範圍內的點,看有幾個根,有幾個根就有幾個集合。include include includeusing ...