poj1679 最小生成樹

2021-09-29 07:21:02 字數 1720 閱讀 8573

給定乙個圖,詢問是否存在不同的最小生成樹

思路:先用kru或者prim跑一條最小生成樹,把最小生成樹裡面的邊存起來,然後每次刪除一條邊跑最小生成樹演算法,看跑出來的生成樹和之前的是否一樣,如果一樣就有不同的最小生成樹,否則就沒有

注意:邊權為0的邊視為圖任然聯通,但是刪除這條邊時就不用和原來的比較(因為跑出來的樹如果和原來的相等,就代表又來了乙個0權邊,不能算作和原來的不一樣)

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define mod (1000000007)

#define middle (l+r)>>1

#define size 10000+10

//#define lowbit(x) (x&(-x))

#define lson (rt<<1)

#define rson (rt<<1|1)

typedef

long

long ll;

const

int inf_max =

0x3f3f3f3f

;const ll linf =

9e18

;const

int maxn =

100+10;

const

double eps=

0.0001

;using

namespace std;

int n,m,cnt,first,another,father[maxn]

,vis[maxn*maxn]

;bool flag;

struct edge

}edge[maxn*maxn]

;vector<

int>v;

void

initial()

intfind

(int x)

void

kru(

bool f)

father[fu]

=fv;

c++;}

if(c==n)

break;}

if(!f&&c!=n)

first=0;

if(f)}}

intmain()

sort

(edge+

1,edge+

1+m)

;kru(0

);// printf("%d\n",first);

// for(int i=0;i// printf("%d ",v[i]);

// printf("\n");

for(

int i=

0;isize()

;i++)if

(flag)

printf

("not unique!\n");

else

printf

("%d\n"

,first);}

return0;

}

poj1679 最小生成樹

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

唯一最小生成樹 POJ 1679

判斷mst時候唯一,用prime演算法,複雜度o n 2 define n 105 int n,m int dis n g n n bool vis n int mx n n 記錄路徑i j最大的邊值 int pre n 記錄最小生成樹路徑 bool intree n n 判斷哪些邊屬於mst in...

POJ 1679 次小生成樹

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