#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include<iostream>
using namespace std;
#define INF 0x3f3f3f3f
int map[1010][1010];
int vis[1010];
int dis[1010]; //
int sum, falg;
void prime(int n)
{
vis[1] = 1;
for(int i = 1; i <= n; i++) //n条边
dis[i] = map[i][1]; //存储一号点所对应点的最小边
for(int i=2; i<=n; i++) //i=1已遍历
{
int k,t=INF; //t用来存最小边 ,k用来存最小边所到达的点
for(int j=1; j<=n; j++)
{
if(!vis[j]&&dis[j]<t)
{
t=dis[j];
k=j;
}
}
if(t==INF)
{
falg = 1;
break;
}
vis[k]=1; //标记已遍历过的点
sum+=t; //将最小边加入最小生成树
for(int j=1; j<=n; j++)
{
if(!vis[j]&&dis[j]>map[j][k])
dis[j]=map[j][k]; //存储最小边所对应点的最小边
}
}
}
int main()
{
int n, m;
while(cin>>n>>m)
{
memset(map,INF,sizeof(map));
memset(vis,0,sizeof(vis));
memset(dis,0,sizeof(dis));
sum = 0;
falg = 0;
int u, v, cost;
while(m--)
{
cin>>u>>v>>cost;
if(cost < map[u][v])
map[u][v] = map[v][u] = cost;
}
prime(n);
if(!falg)
cout<<sum<<endl;
else if(m < n - 1)
cout<<"0"<<endl;
}
return 0;
}
2144 数据结构实验之图论九:最小生成树
最新推荐文章于 2020-11-21 09:01:54 发布