程式設計說明
程式設計環境:平臺執行
程式語言:C
第一題程式碼
參考自https://www.cnblogs.com/minesweeper/p/6114804.html
Prim
#include <stdio.h>
#include <stdlib.h>
#define INF 10000
int N, M;
int TotalCost = 0;
int Cost_Matrix[1001][1001];
int dist[1001];
void Init();
int Prim();
int Find_Min();
int main()
{
Init();
printf("%d", Prim());
return 0;
}
void Init()
{
int v1, v2, cost;
//獲取城鎮數目、道路條數
scanf("%d %d", &N, &M);
//初始化鄰接矩陣
for(int i = 1; i <= N; i++)
for(int j = 1; j <= N; j++)
{
if(i != j)
Cost_Matrix[i][j] = INF;
else
Cost_Matrix[i][j] = 0;
}
//獲取鄰接矩陣的權值
for(int i = 1; i <= M; i++)
{
scanf("%d %d %d", &v1, &v2, &cost);
Cost_Matrix[v1][v2] = cost;
Cost_Matrix[v2][v1] = cost;
}
}
int Prim()
{
int k;
for(int i = 1; i <= N ;i++)
{
dist[i] = Cost_Matrix[1][i];
}
for(int i = 1; i < N; i++) /* 生成樹還需要收n-1個節點 */
{
k = Find_Min();
if(!k) //k=0,表示找不到dist[V]最小者,則跳出
return -1;
else //k!=0說明找到dist[V]最小者
{
//將V收錄進最小生成樹,並累加器長度
TotalCost += dist[k];
dist[k] = 0;
//更新V的鄰接點W的dist[W]值
for(int j = 2; j <= N; j++)
{
if(dist[j] && Cost_Matrix[k][j] < dist[j])
dist[j] = Cost_Matrix[k][j];
}
}
}
return TotalCost;
}
int Find_Min()
{
int k = 0;
int MinDist = INF;
for(int i = 2; i <= N ;i++)
{
if(dist[i] && dist[i] < MinDist)
{
MinDist = dist[i];
k = i;
}
}
return k;
}