POJ 1679 判斷最小樹是否唯一

2021-06-22 08:07:22 字數 1707 閱讀 5518

題意:

給你乙個圖,問你最小樹是否唯一,唯一則輸出最小數的權值,不唯一輸出not unique!

思路:

題目問的是最小樹是否唯一,其實也就是在問次小樹是否等於最小樹,如果等於則不唯一,求次小樹快的方法應該是先求最小樹,然後列舉刪除最小樹上的邊,最快的應該是樹形dp優化的那個吧,剛剛忘記了,直接求出最小樹,然後暴力深搜分成兩個集合列舉,0ms ac,因為點才100,所以暴力也無壓力。

#include

#include

#include

#define n_node 100+10

#define n_edge 20000

+100

#define inf 1000000000

using

namespace std;

typedef

struct

star;

typedef

struct

edge;

star e[n_edge];

edge edge[n_edge]

,tree[n_node];

int list[n_node]

,tot;

int mer[n_node];

int mark[n_node];

int map[n_node][n_node];

int node_l[n_node]

,node_r[n_node];

int ll ,rr;

void

add(

int a ,

int b)

bool

camp

(edge a ,edge b)

intfinds

(int x)

void

dfs1

(int s)

}void

dfs2

(int s)

}int

minn

(int x ,

int y)

intmain

()sort

(edge +

1,edge + m +

1,camp);

int sum =0;

for(i =

1;i <= n ;i ++) mer[i]

= i;

memset

(list ,0,

sizeof

(list))

,tot =1;

int tt =0;

for(i =

1;i <= m ;i ++)

int now =

1000000000

;for

(i =

1;i <= tt ;i ++)}if

(now != sum)

printf

("%d\n"

,sum);

else

printf

("not unique!\n"

);}return0;

}

POJ 1679(判斷MST是否唯一)

the unique mst 給你乙個圖,讓你判斷這個圖中的最小生成樹是不是唯一的。這題看起來挺簡單的,就是刪邊,我們先把最小生成樹求出來,再逐個刪掉其中的邊,看看刪邊之後的最小生成樹是不是還是那個值。但是細節很多,收穫頗豐。首先這個題可能會有不連通的狀態。再就是用kruskal刪邊的時候,假若說有...

poj1679 最小生成樹

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

poj1679 最小生成樹

給定乙個圖,詢問是否存在不同的最小生成樹 思路 先用kru或者prim跑一條最小生成樹,把最小生成樹裡面的邊存起來,然後每次刪除一條邊跑最小生成樹演算法,看跑出來的生成樹和之前的是否一樣,如果一樣就有不同的最小生成樹,否則就沒有 注意 邊權為0的邊視為圖任然聯通,但是刪除這條邊時就不用和原來的比較 ...