題意:
給你乙個圖,問你最小樹是否唯一,唯一則輸出最小數的權值,不唯一輸出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的邊視為圖任然聯通,但是刪除這條邊時就不用和原來的比較 ...