次小生成樹

2021-09-05 16:43:19 字數 1114 閱讀 9942

#includeusing namespace std;

const int maxn=110;

struct nodeedge[maxn*maxn];//鄰接表存邊

int father[maxn],used[maxn];//fa是並查集用,used標置此邊使用左未

int n,m,cost1,cost2,num;//n個點m條邊,最小花費次小花費,當前生成樹已連邊數

bool flag1,flag2;//兩個標誌解釋見main函式

bool cmp(node a,node b)//小權值優先

int find(int x)

void kruskal()//邊數比點數少2及以上即如果圖不連通,標記flag1=true,返回

for(int i=1;i<=n;i++)father[i]=i;//每個人初始為樹根

sort(edge,edge+m,cmp);//對邊按邊權排序

for(int i=0;i}

if(num!=n-1)//最後連的邊數不夠n-1,圖不連通標記flag1清零花費

}void sec_kruskal()

}if(tot==n-1)//如果連出了n-1條邊就表示找到,cost2是次小生成樹最小花費

}}int main()

if(m==n-1)//圖連通且僅有n-1條邊,直接輸出

sec_kruskal();//找次小生成樹,更新cost1與flag1

if(flag2) printf("not unique!\n");

else printf("%d\n",cost1);

}return 0;

}次小生成樹poj 1679 the unique mst

存在次小生成樹則輸出「not unique!」

否則輸出最小生成樹的邊權和

複雜度onm

sample input

23 3

1 2 1

2 3 2

3 1 3

4 41 2 2

2 3 2

3 4 2

4 1 2

sample output

3not unique!

最小生成樹 次小生成樹

一 最小生成樹 說到生成樹首先要解釋一下樹,樹是乙個聯通的無向無環圖,多棵樹的集合則被稱為森林。因此,樹具有許多性質 1.兩點之間的路徑是唯一的。2.邊數等於點數減一。3.連線任意兩點都會生成乙個環。對於乙個無向聯通圖g的子圖,如果它包含g的所有點,則它被稱為g的生成樹,而各邊權和最小的生成樹則被稱...

次小生成樹

演算法引入 設g v,e,w 是連通的無向圖,t是圖g的一棵最小生成樹 如果有另一棵樹t1,滿足不存在樹t t t1 則稱t1是圖g的次小生成樹 演算法思想 鄰集的概念 由t進行一次可行交換得到的新的生成樹所組成的集合,稱為樹t的鄰集,記為n t 設t是圖g的最小生成樹,如果t1滿足 t1 min,...

次小生成樹

分類 圖論 2013 02 12 15 03 32人閱讀收藏 舉報次小生成樹 在求最小生成樹時,用陣列path i j 來表示mst中i到j最大邊權。求完後,直接列舉所有不在mst中的邊,把它加入到mst中構成一棵新的樹,且該樹有環,此環是由剛加入的邊 i,j 造成的,所以可以通過刪除path i ...