環和鏈的判斷

2022-06-02 05:00:14 字數 2040 閱讀 3430

給一一副有單環或

鏈的圖 判斷是否同構

我們可以判斷環有多少個,鏈有多少個,同時判斷一下每個環的點數和鏈的點的個數

第一種做法:

所以,我們可以直接用並查集來做.

同時,我們注意到兩幅圖的人數應該是一樣的.

所以,把並查集修改一下就直接判斷了. (如果成環,最後成環的並集會讓點的個數加倍.  同時,因為人數是固定的,所以可以直接sort,然後比較)

#include using

namespace

std;

int fa[10050

];int id1[10050], id2[10050

]; int find(int idx)

inline

void union(int x, int

y) int

main()

cnt1 = cnt2 = 0

;

for (i=1; i<=n; ++i)

if (fa[i]<0) id1[cnt1++] =abs(fa[i]);

memset(fa, -1, sizeof

(fa));

scanf(

"%d%d

", &n, &m);

for (i=1; i<=m; ++i)

for (i=1; i<=n; ++i)

if (fa[i]<0) id2[cnt2++] =abs(fa[i]);

printf(

"case #%d:

", cas);

if (cnt1 !=cnt2)

sort(id1, id1+cnt1);

sort(id2, id2+cnt2);

for (i=0; ii)

if (id1[i] != id2[i]) break

;

if (i==cnt1) printf("

yes\n");

else printf("

no\n");

}return0;

}

view code

第二種做法:

我們注意到別個點的度數都只有2.所以我們tarjan可以根據點的個數和度數來判環.

用tarjan求連通分量, 同時將每個環和鏈的點數分別求出.

#include #include 

#include

using

namespace

std;

struct

edge ;

class

tarjan

inline

void add(int u, int

v)

void

build()

}void tarjan(int

u)

else

if(inst[v])

}if (dfn[u] ==low[u])

while (st[top--] !=u);

if (cnt_node*2 == cnt_in) //

這個題度數都只有2 所以如果節點數乘以2等於所有點入度,那麼就成環.

cir[cir_cnt++] =cnt_node;

else

line[line_cnt++] =cnt_node;}}

void

_get()

}t1, t2;

intmain()

sort(t1.cir, t1.cir+t1.cir_cnt);

sort(t2.cir, t2.cir+t2.cir_cnt);

bool flag = true

;

for (i=0; ii)

}if(flag) }}

if (flag) printf("

yes\n");

else printf("

no\n");

}return0;

}

view code

LeetCode 判斷單鏈列表是否存在環

判斷單鏈列表是否存在環,即某個節點的next指向鍊錶中在它前面的節點,這樣在鍊錶尾部形成一環。1.判斷是否存在環 用乙個fast指標,乙個slow指標,slow每次移動1,fast每次移動2.若鍊錶存在環,移動快的fast指標一定在環內追趕上移動慢的slow指標,則相遇 2.找到環的入口 當兩指標第...

F Wormholes spfa判斷負環

傳送門 題意 艾高比較差qaq。意思是農夫發現了蟲洞,他發現從乙個點到另乙個點會花費一些時間,存在一些點到點可以到退時間。問farm是否可以通過乙個迴路回到過去。就是問是否存在一條負權的邊。思路 spfa判斷負環模板即可,要注意,有些蟲洞是可以來回的,所以一條邊要新增兩次 題目中給出,是雙向路徑 既...

判斷入環點

給定乙個鍊錶,返回鍊錶開始入環的第乙個節點。如果鍊錶無環,則返回 none.思路 使用快慢指標,先判斷是否有環,若有慢指標重回起點,各走一步,重合點為入環點.class node def init self,data self.data data self.next none def repr se...