#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
#define inf 999999999
int mp[1024][1024];
int vis[1024];
int dist[1024];
int n,m;
void prime()
{
int minn;
int i,j,v;
int sum=0;
for(i=1;i<=n;i++)
dist[i]=mp[1][i];//初始化权值
vis[1]=1;
for(i=2;i<=n;i++)//找生成树集合点相连的最小权值的边
{
minn=inf;
v=-1;
for(j=1;j<=n;j++)
{
if(dist[j]<minn&&!vis[j])//如果没有走过这个点并且有这条边小于最小值
{
minn=dist[j];
v=j;
}
}
if(v!=-1)
{
sum=sum+dist[v];//增加权值
vis[v]=1;//加入最小生成树集合
for(j=1;j<=n;j++)//在最小生成树种加入一个点,就要和这个集合之外的店比较,不断的找最小的那一条边
{
if(!vis[j]&&mp[v][j]<dist[j])
dist[j]=mp[v][j];
}
}
}
for(i=1;i<=n;i++)
{
if(!vis[i])
{
sum=-1;
break;
}
}
cout<<sum<<endl;
}
int main()
{
int u,v,w,i,j;
while(cin>>n>>m)
{
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
if(i==j) mp[i][j]=mp[j][i]=0;
else
mp[i][j]=mp[j][i]=inf;//初始化图
}
memset(vis,0,sizeof(vis));
for(i=0;i<m;i++)
{
cin>>u>>v>>w;
mp[u][v]=mp[v][u]=w;
}
prime();
}
}
3362 数据结构实验之图论六:村村通公路
最新推荐文章于 2024-05-16 16:43:57 发布