题目:http://acm.hdu.edu.cn/showproblem.php?pid=1863
大同小异
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=110;
const int maxcost=99999999;
int graph[maxn][maxn],lowcost[maxn];
int prim(int n){
int lowcost[maxn];
int mst[maxn];
int i,j,minn,minid,sum=0;
for(i=2;i<=n;i++){ //lowcost初始化
lowcost[i]=graph[1][i];
mst[i]=1;
}
mst[1]=0;
for(i=2;i<=n;i++){
minn=maxcost;
minid=0;
for(j=2;j<=n;j++){
if(lowcost[j]<minn&&lowcost[j]!=-1){ //上一层已经把找过的赋为-1
minn=lowcost[j];
minid=j;
}
}
if(minn==maxcost)
return -1; //不连通
//printf("%c - %c : %d\n", mst[minid] + 'A' - 1, minid + 'A' - 1, min);
sum+=minn;
lowcost[minid]=-1;
for(j=2;j<=n;j++){ //找新起点,谁小换谁,相同不换
if(graph[minid][j]<lowcost[j]){
lowcost[j]=graph[minid][j];
mst[j]=minid; //mst中每一个都是minid,到下次时可以表示起点,然后 - 下一个minid
}
}
}
return sum;
}
int main(){
int n,m,a,b,val;
while(scanf("%d%d",&n,&m)==2&&n){
fill(graph[0],graph[0]+maxn*maxn,maxcost);
fill(lowcost,lowcost+maxn,maxcost);
for(int i=0;i<n;i++){
scanf("%d%d%d",&a,&b,&val);
graph[a][b]=graph[b][a]=val;
}
int ans=prim(m);
if(ans==-1)
printf("?\n");
else
printf("%d\n",prim(m));
}
return 0;
}