prim模版
#include<stdio.h>
#include<string.h>
#define MAX 0x3f3f3f3f
int logo[101];
int map[101][101];
int dis[101];
int n;
int prim()
{
int i,j,now;
int sum=0;
for(i=1; i<=n; i++)
{
dis[i]=MAX; //dis初始化为最大值
logo[i]=0; //logo标记数组初始化为0
}
for(i=1; i<=n; i++)
{
dis[i]=map[1][i]; //以1为起点,能与1连通的用map[1][i]覆盖dis[i]的MAX
}
dis[1]=0; //与起点的距离为0
logo[1]=1; //1已经访问过,标记
for(i=1;i<=n;i++)
{
now=MAX; //now记录最短距离的序号
int min=MAX; //min记录最短距离的值
for(j=1; j<=n; j++)
{
if(logo[j]==0&&dis[j]<min) //j未访问且之比当前最小值小
{
now=j;
min=dis[j]; //更新最短距离的序号和值
}
}
if(now==MAX) //没被刷新
break; //跳出循环
logo[now]=1; //访问now
sum+=min; //计入和sum
for(j=1; j<=n; j++)
{
if(logo[j]==0&&dis[j]>map[now][j]) //将now加入已访问点,更新与now连通的
dis[j]=map[now][j];
}
}
if(i<n) //中途break
printf("?\n");
else
printf("%d\n",sum);
return 0;
}
int main()
{
int a,b,c,d,m,i;
while(scanf("%d%d",&m,&n))
{
if(m==0)
break;
memset(map,0x3f3f3f3f,sizeof(map));
for(i=0; i<m; i++)
{
scanf("%d%d%d",&a,&b,&c); //起点a,终点a,权值c
if(c<map[a][b]) //出现ab连通有两条路,只记录短的那条
map[a][b]=map[b][a]=c;
}
prim();
}
}