POJ 1679(判斷MST是否唯一)

2021-09-17 01:48:49 字數 1254 閱讀 4483

the unique mst

給你乙個圖,讓你判斷這個圖中的最小生成樹是不是唯一的。

這題看起來挺簡單的,就是刪邊,我們先把最小生成樹求出來,再逐個刪掉其中的邊,看看刪邊之後的最小生成樹是不是還是那個值。但是細節很多,收穫頗豐。首先這個題可能會有不連通的狀態。再就是用kruskal刪邊的時候,假若說有一條邊的邊權為0,那麼如果我們此時恰好刪這條邊,那麼刪邊後的圖時可能是不連通的,但是由於kruskal是不斷增邊的,所以我們算出的答案還是原本的值。這個時候我們應該判斷一下刪邊之後的圖是不是聯通,不連通直接continue。

#include

#include

#include

#include

#include

#include

using namespace std;

int n,m;

struct nodeedge[

200001];

int vis[

200001

],f[

200001

],a[

200001];

intfinder

(int x)

void

combine

(int x,

int y)

intcmp

(node a,node b)

void

init()

intmain()

sort

(edge +

1,edge + m +

1,cmp)

;int sum =0;

int tot =0;

int edgenum =0;

for(

int i =

1; i <= m ;

++i)

}int flag =0;

if(edgenum != n -1)

flag =1;

for(

int i =

1; i <= tot ;

++i)}}

if(finder(1

)!=finder

(n))

continue;if

(sum1 == sum)}if

(flag)

cout <<

"not unique!"

<< endl;

else

cout << sum << endl;

}}

POJ 1679 判斷最小樹是否唯一

題意 給你乙個圖,問你最小樹是否唯一,唯一則輸出最小數的權值,不唯一輸出not unique 思路 題目問的是最小樹是否唯一,其實也就是在問次小樹是否等於最小樹,如果等於則不唯一,求次小樹快的方法應該是先求最小樹,然後列舉刪除最小樹上的邊,最快的應該是樹形dp優化的那個吧,剛剛忘記了,直接求出最小樹...

poj1679 最小生成樹

題目大意 判斷是否存在最小生成樹。如果存在,判斷其是否唯一。用prim演算法求最小生成樹。將其中的每一條邊依次替換,權值是否和最小生成樹相同。如果相同,則最小生成樹不唯一。如果都不相同,則唯一。這個prim的模板比較好,可以再求最小生成樹的同時直接進行判斷唯一性。如下 include include...

POJ 1679 次小生成樹

判斷最小生成樹是否唯一,方法是這樣的 1.對圖中每個點,掃瞄其他的邊,如果存在其他權值相同的邊,則對改邊作標記 2.然後用 kruskal或者prim 求mst 3.求的mst後,如果該mst不包含作了標記的邊,即可判定mst唯一 如果包含作了標記的邊,則依次去掉這些邊在求mst,如果求的mst權值...