用prime算法写了最小生成树,忽然发现比kruskal要简单许多,这道题以前刷过,现在用prime写感觉挺简单
#include<stdio.h>
#include<string.h>
#define INTMAX 1000000
int n,r,map[52][52],a[55],min;
void init()
{
int i,j;
min=0;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
map[i][j]=INTMAX;
a[i]=1;
}
}
int main()
{
int i,j,v1,v2,w,k,y,t;
while(scanf("%d",&n)&&n)
{
scanf("%d",&r);
init();
for(i=0;i<r;i++)
{
scanf("%d%d%d",&v1,&v2,&w);
if(w<map[v1][v2]) map[v1][v2]=map[v2][v1]=w;
}
a[1]=0;
t=n-1;
while(t--)
{
k=INTMAX;
for(i=1;i<=n;i++)
{
if(a[i]==1) continue;
for(j=1;j<=n;j++)
{
if(a[j]==0) continue;
if(map[i][j]<=k)
{
k=map[i][j];
y=j;
}
}
}
min+=k;
a[y]=0;
}
printf("%d\n",min);
}
return 0;
}