給定乙個圖,詢問是否存在不同的最小生成樹
思路:先用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權值...