#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 ...