並查集 判斷環,樹

2021-10-10 07:04:11 字數 3290 閱讀 4639

hdu - 1272 小希的迷宮

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define inf 0x3f3f3f3f

using

namespace std;

typedef

long

long ll;

typedef

unsigned

long

long ull;

inline

intread()

while

(ch>=

'0'&&ch<=

'9') s=s*

10+ch-

'0',ch=

getchar()

;return s*w;

}const

int maxn =

1e5+5;

/* 題意:問由給定若干條無向邊構成的圖是否存在環,是否為單連通圖

* 分析:判斷條件1:只要給定的兩個邊的端點有共同根節點則存在環

* 判斷條件2:只有乙個根節點才為單連通圖

*/int pre[maxn]

,y,x;

// pre[i] 記錄 i 的根節點

bool vis[maxn]

;// 標記出現過的節點

intfind

(int x)

void

union

(int fx,

int fy)

intmain()

// 空圖也符合

memset

(vis,

false

,sizeof

(vis));

for(

int i=

1;i) pre[i]

=i;bool flag=

false

;int fx=

find

(x),fy=

find

(y);

if(fx==fy) flag=

true

;else

union

(fx,fy)

;while(~

scanf

("%d%d"

,&x,

&y)&&x!=

0&&y!=0)

int cnt=0;

// 記錄根節點的個數

for(

int i=

1;i(vis[i]

&&pre[i]

==i) cnt++;if

(cnt>

1) flag=

true;if

(flag)

puts

("no");

else

puts

("yes");

}return0;

}

hdu - 1325 is it a tree?

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define inf 0x3f3f3f3f

using

namespace std;

typedef

long

long ll;

typedef

unsigned

long

long ull;

inline

intread()

while

(ch>=

'0'&&ch<=

'9') s=s*

10+ch-

'0',ch=

getchar()

;return s*w;

}const

int maxn =

1e5+5;

/* * 和上一題相似

* 題意:由有向邊構成的圖是否為乙個樹

* 分析:構成樹的條件:1.無環 2.除根節點外,節點入度為1 3.只有乙個根節點

*/int pre[maxn]

,y,x,deg[maxn]

;bool vis[maxn]

;int

find

(int x)

void

union

(int x,

int y,

int fx,

int fy)

intmain()

memset

(vis,

false

,sizeof

(vis));

memset

(deg,0,

sizeof

(deg));

for(

int i=

1;i) pre[i]

=i;bool flag=

false

;int fx=

find

(x),fy=

find

(y);

if(fx==fy) flag=

true

;else

union

(x,y,fx,fy)

; edge++

;while(~

scanf

("%d%d"

,&x,

&y)&&x!=

0&&y!=0)

int cnt=0;

for(

int i=

1;i((edge+1)

!=cnt) flag=

true;if

(!flag)

printf

("case %d is a tree.\n"

,++cas)

;else

printf

("case %d is not a tree.\n"

,++cas);}

return0;

}

並查集 判斷是否為樹

問題描述 樹是一種大家都不陌生的資料結構,它有可能是一顆空樹或是一些滿足要求的節點連線而成的有向邊的集合。一棵樹只有乙個根節點,根節點沒有指向它的邊。除了根節點的每乙個節點都只有一條邊指向它。出現環的圖都不是樹。對一些節點連線而成的有向邊的集合進行判定,判定每一組的輸入資料構成的圖是否是一棵樹。輸入...

並查集判斷環 並查集的路徑壓縮 和 帶秩優化

1.判斷環 參考部落格 思路 1.將用過的路徑連起來成為乙個集合,記錄下來 2.如果連通的兩個邊屬於乙個集合,那麼這個並查集就形成了乙個環 燈神 如果刪除2,4邊 可將2,4這條邊刪除測試 是否正確 如果刪除此邊則不會出現環記得將6改為5 initialise parent for int i 0 ...

並查集(判斷環路)

並查集是非常常用的一種資料結構,用於把資料按照規則整理成集合,集合最終呈現為樹狀結構,以根節點作為不同集合的區分標誌,實現方面主要涉及查詢和合併,如下 查詢 int find int x return r 合併 void unionset int x,int y 不難理解,其目的就是為了構建乙個森林...