費用第二小的方案的定義為:與費用最小的方案不完全相同,且費用值除費用最小的方案外最小。
同vijos 1070 **:
題解:次小生成樹,就是求除了最小生成樹之外最小的那個生成樹。
下面介紹一下利用prim求次小生成樹的主要步驟。
1.先求出來最小生成樹。並將最小生成樹任意兩點之間路徑當中的權值最大的那一條找出來,為什麼要找最大的呢,因為生成樹加入一條邊之後一定構成了迴路,那麼肯定要去掉這個迴路當中一條邊才是生成樹,那麼,怎麼去邊才是次小的,那就去掉除了剛剛新增的一條邊之外迴路當中權值最大的乙個,所以留下的就是最小的。
2.列舉最小生成樹外的每一條邊。找出最小的就是次小生成樹。
**如下,若還是不懂,**中有注釋,可自行參悟
1 #include2 #include3using
namespace
std;
4int s,minn,g[501][501],m,x,y,z,ss,minn2,low[501],pre[501],low2[501][501
]; 5
int i,mini,sum,n,t; bool b[501],used[501][501];6
intmain() 715
for(i=1;i<=m;i++)
16
20for(i=1;i<=n;i++)
21 low[i]=123456789,pre[i]=i;
22 pre[1]=0
; 23 low[1]=0;s=0;ss=923456789;24
intk,kk;
25while(1
)
2635}36
if(minn==123456789)break
;37 b[mini]=1
;38 s=s+minn;
39 used[mini][pre[mini]]=used[pre[mini]][mini]=1;40
for(i=1;i<=n;i++)
4147
}48 printf("
cost: %d\n
",s);
49for(int i=1;i<=n;i++)
5055
if(ss==923456789)ss=-1;//
如果沒有邊可以替換,即沒有最小生成樹,輸出-1
56 printf("
cost: %d
",ss);
57 }
最小生成樹 次小生成樹
一 最小生成樹 說到生成樹首先要解釋一下樹,樹是乙個聯通的無向無環圖,多棵樹的集合則被稱為森林。因此,樹具有許多性質 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 ...