您的位置:首页 > 理论基础 > 数据结构算法

3362 数据结构实验之图论六:村村通公路

2016-11-25 20:56 190 查看
数据结构实验之图论六:村村通公路

#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])
{

b2eb
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();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: