#include<iostream>
using namespace std;
#define MAX 105
#define MAXCOST 1<<30
int map[MAX][MAX];
int lowcost[MAX],mst[MAX];
void prim(int n)
{
for(int i=1;i<=n;i++)
lowcost[i]=map[1][i],mst[i]=0;
int sum=0;
lowcost[1]=1;
mst[1]=1;
for(int i=1;i<n;i++){
int min=MAXCOST;
int mink=1;
for(int j=1;j<=n;j++){
if(!mst[j]&&lowcost[j]<min)
{
min=lowcost[j];
mink=j;
}
}
mst[mink]=1;
sum+=min;
for(int j=1;j<=n;j++){
if(!mst[j]&&map[mink][j]<lowcost[j])
lowcost[j]=map[mink][j];
}
}
if(sum<=0)
printf("?\n");
else
printf("%d\n",sum);
}
int main()
{
int m,n,a,b,c,cost;
while(cin>>m>>n)
{
if(m==0)break;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
{
if(i!=j)
map[i][j] = MAXCOST;
else
map[i][i] = 0;
}
for (int i = 1; i <= m; i++)
{
cin>>a>>b>>c;
if(c<map[a][b])
map[a][b] = map[b][a] = c;
}
prim(n);
}
return 0;
}
【模板】最小生成樹prim算法
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.