裸最小生成树
注意重边
#include<stdio.h>
#include<string.h>
#include <algorithm>
#include <bits/stdc++.h>
int visited[105],map[105][105],lowcost[105],n,m;
int prime(int v)
{
int i,j,minn,k,sum=0;
for(i=1;i<=n;i++)
lowcost[i]=map[v][i];
visited[v]=1;
for(i=2;i<=n;i++)
{
minn=1000000;
for(j=1;j<=n;j++)
if(lowcost[j]<minn&&visited[j]==0)
{
minn=lowcost[j];
k=j;
}
sum=sum+minn;
visited[k]=1;
for(j=1;j<=n;j++)
if(lowcost[j]>map[k][j]&&visited[j]==0)
lowcost[j]=map[k][j];
}
return sum;
}
int main()
{
int i,j,a,b,qwe;
while(scanf("%d %d",&n,&m)!=EOF)
{
memset(visited,0,sizeof(visited));
for(i=0;i<=n;i++)
for(j=0;j<=n;j++) map[i][j]=1000000;
for(i=1;i<=n;i++) map[i][i]=0;
for(i=0;i<m;i++)
{
scanf("%d%d%d",&a,&b,&qwe);
if(map[a][b]>100000||map[a][b]>qwe)
map[a][b]=map[b][a]=qwe;
}
printf("%d\n",prime(1));
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。