題目描述
根據輸入建立無向網。分別用prim演算法和kruskal演算法構建最小生成樹。(假設:輸入資料的最小生成樹唯一。)
輸入頂點數n
n個頂點
邊數mm條邊資訊,格式為:頂點1 頂點2 權值
prim演算法的起點v
輸出輸出最小生成樹的權值之和
對兩種演算法,按樹的生長順序,輸出邊資訊(kruskal中邊頂點按陣列序號公升序輸出)
樣例輸入
6v1 v2 v3 v4 v5 v6
10v1 v2 6
v1 v3 1
v1 v4 5
v2 v3 5
v2 v5 3
v3 v4 5
v3 v5 6
v3 v6 4
v4 v6 2
v5 v6 6
v1樣例輸出
15prim:
v1 v3 1
v3 v6 4
v6 v4 2
v3 v2 5
v2 v5 3
kruskal:
v1 v3 1
v4 v6 2
v2 v5 3
v3 v6 4
v2 v3 5
#include
#include
#include
#include
using namespace std;
const
int maxn =
105;
const
int inf =
0x3f3f3f3f
;int graph[maxn]
[maxn]
;int pre[maxn]
;int dis[maxn]
;bool vis[maxn]
;int from[maxn]
;int n;
mapint> name;
intfind
(int x)
void
combine
(int x,
int y)
string getname
(int i)
void
init()
}void
prim
(int s)
cout << sum << endl;
cout <<
"prim:"
<< endl;
cout << ss.
str();
}void
kruskal()
};priority_queue pq;
for(
int i =
0; i < n; i++
)for
(int j = i; j < n; j++)if
(graph[i]
[j]!= inf)
pq.push
(node);
while
(!pq.
empty()
)}}int
main()
int m;
cin >> m;
for(
int i =
0; i < m; i++
)
string s;
cin >> s;
prim
(name[s]);
kruskal()
;}
資料結構 最小生成樹
生成樹 乙個連通圖的最小連通子圖稱作該圖的生成樹。有n個結點的連通圖的生成樹有n個結點和n 1條邊。乙個有n個結點的連通圖的生成樹是原圖的極小連通子圖,它包含原圖中的所有n個結點,並且有保持圖連通的最少的邊。由生成樹的定義可知 若在生成樹中刪除一條邊,就會使該生成樹因變成非連通圖而不再滿足生成樹的定...
資料結構(最小生成樹)
對於乙個無相連通網,他的所有生成樹中必有一棵邊的權值總和最小的生成樹,稱之為最小代價生成樹,簡稱最小生成樹。最小生成樹必須滿足三個條件 1 構造的最小生成樹必須包括n個頂點 2 構造的最小生成樹有且僅有n 1條邊 3 構造的最小生成樹中不存在迴路。普利姆演算法 prim 假設g v,e 為一無向連通...
資料結構 最小生成樹
對於乙個圖連通圖g,n個點,e條邊,最小生成樹就是n 1條邊圖的生成子圖,且這n 1條邊的權值和最小。對於乙個圖的兩種演算法 prim演算法和kruskal演算法,這兩種演算法都是基於貪心思想的。偽 實現 輔助變數 lowcost陣列,儲存當前可連通的其他節點的最小權值。cnt 0表示當前樹連線節點...