这个题目的意思就是现在有一些边,然后问你用这些边组成最小生成树的权值是多少。关键在于存储结构和如何处理重复的边,其实当解决了存储结构的问题,。这个题目的算法就出来了,一切问题就全都解决了,我的是primer算法。
这个就是我的程序。明天整理一下kruskal算法。
#include<iostream>
#include<cstring>
#include<stdio.h>
using namespace std;
int map[55][55];
int visited[55];
int main()
{
int n,m,a,b,len,i,mini,flag,j,sum;
while(cin>>n)
{
if(n==0)
break;
cin>>m;
sum=0;
memset(visited,0,sizeof(visited));
for(i=0;i<=50;i++)
for(j=0;j<=50;j++)
map[i][j]=200;
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&len);
if(map[a][b]>len)
{
map[a][b]=len;
map[b][a]=len;
}
}
for(i=1;i<=n;i++)
map[i][i]=200;
visited[1]=1;
for(i=2;i<=n;i++)
{
mini=200;
for(j=1;j<=n;j++)
{
if(visited[j]==0&&map[1][j]<mini)
{
flag=j;
mini=map[1][j];
}
}
sum=sum+mini;
visited[flag]=1;
for(j=1;j<=n;j++)
if(visited[j]==0&&map[1][j]>map[flag][j])
map[1][j]=map[flag][j];
}
cout<<sum<<endl;
}
return 0;
}