prim算法
要点见注释
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
#define maxn 100
#define inf 0xfffffff
int N; //总点数
int d[maxn][maxn];//图
int v[maxn];//已选标记
int l[maxn];//点到已选点最短路径长度
int prim()
{
int ans=0;//结果
memset(v,0,sizeof(v));//初始化,清零
v[0]=1;
l[0]=0;//已选(0,0)为起点
for(int i=1;i<N;i++)
{
l[i]=d[0][i];
}
for(int i=1;i<N;i++)
{
int m=inf,temp;
for(int j=0;j<N;j++)
{
if(!v[j]&&m>l[j])
{
m=l[temp=j];//temp记录j值,下用
}
}
ans+=m;
l[temp]=0;//temp
v[temp]=1;//temp
for(int i=0;i<N;i++)//更新l数组
{
l[i]=min(l[i],d[temp][i]);
}
}
return ans;
}
int main()
{
int p,q; //只负责接受数据,不做任何处理
for(int i=0;i<N;i++)//或者memset(d,inf,sizeof(d));
{
for(int j=0;j<N;j++)
{
d[i][j]=inf;
}
}
while(scanf("%d",&N)&&N)
{
for(int i=0;i<N;i++)
{
for(int j=i+1;j<N;j++)
{
scanf("%d %d %d",&p,&q,&d[i][j]);
d[j][i]=d[i][j];//易忽视点
}
}
printf("%d\n",prim());
}
return 0;
}