第一次学习最小生成树,虽然懂得思路,但一直写不出具体代码。参考了大牛的代码后,仔细推敲,总算明白了。其中最重要的是记得不断更新权值以及把与新加入的相连点的最小权值也当做是原点的边,并更新成最小,然后一直下去就能。。。。。!你懂得
#include<iostream>
#include<cstring>#include<cstdlib>
#include<queue>
#include<cstdio>
#include<algorithm>
#define MAX 1000000
using namespace std;
int map[101][101];//存放点到点的
int mark[101]; //标记
int flag; //记录权值最小的点
int main()
{
int N,x,y,dis;
while(scanf("%d",&N),N)
{
int m=(N*(N-1))/2;
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&x,&y,&dis);
map[x-1][y-1]=map[y-1][x-1]=dis;
}
for(int i=0;i<N;i++) map[i][i]=MAX;
mark[N];
memset(mark,0,sizeof(mark));
mark[0]=1;
int sum=0;
for(int i=0;i<N-1;i++)
{
int MIN=MAX;
for(int j=0;j<N;j++)
{
if(!mark[j]&&map[0][j]<MIN)
{
MIN=map[0][j];
flag=j;
}
}
sum+=MIN;
mark[flag]=1; //把权值最小的点加入
for(int k=0;k<N;k++)
{
if(!mark[k]&&map[0][k]>map[flag][k]) //更新权值
map[0][k]=map[flag][k];
}
}
printf("%d\n",sum);
}
return 0;
}