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權值...