給一一副有單環或
鏈的圖 判斷是否同構
我們可以判斷環有多少個,鏈有多少個,同時判斷一下每個環的點數和鏈的點的個數
第一種做法:
所以,我們可以直接用並查集來做.
同時,我們注意到兩幅圖的人數應該是一樣的.
所以,把並查集修改一下就直接判斷了. (如果成環,最後成環的並集會讓點的個數加倍. 同時,因為人數是固定的,所以可以直接sort,然後比較)
#include usingview codenamespace
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;
}
第二種做法:
我們注意到別個點的度數都只有2.所以我們tarjan可以根據點的個數和度數來判環.
用tarjan求連通分量, 同時將每個環和鏈的點數分別求出.
#include #includeview code#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;
}
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...