链接:点击打开链接
模板题。。。
#include<stdio.h>
#include<string.h>
#define MAX 100000
int edges[101][101];
int vexset[101];
int lowcost[101];
int m,i,j;
void prim(int v)
{
int k,h=0,min,sum;
for(i=2;i<=m;i++)
{
lowcost[i]=edges[v][i];
vexset[i]=0;
}
vexset[1]=1;
sum=0;
for(i=2;i<=m;i++)
{
min=MAX;
for(j=2;j<=m;j++)
{
if(vexset[j]==0&&lowcost[j]<min)
{
min=lowcost[j];
k=j;
}
}
if(min!=MAX)
{
sum+=min;
h++;
}
vexset[k]=1;
v=k;
for(j=2;j<=m;j++)
{
if(vexset[j]==0&&lowcost[j]>edges[v][j])
lowcost[j]=edges[v][j];
}
}
if(h==(m-1))
printf("%d\n",sum);
else
printf("?\n");
}
int main()
{
int n,a,b,x;
while(~scanf("%d %d",&n,&m)&&n)
{
for(i=1;i<=m;i++)
for(j=1;j<=m;j++)
edges[i][j]=MAX;
for(i=1;i<=n;i++)
{
scanf("%d %d %d",&a,&b,&x);
edges[a][b]=x;
edges[b][a]=x;
}
if(n<(m-1))
printf("?\n");
else
prim(1);
}
return 0;
}