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

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

2017-12-03 16:16 134 查看


PS:最小生成树, Prim算法

#include <bits/stdc++.h>
#define INF 0x3f3f3f3f

using namespace std;

int MG[1005][1005];//邻接矩阵储存图
int dis[1005];//记录当前生成树到每个节点的距离
bool visit[1005];//标记数组
int Sum, n, m;//最小生成树的权值总和, 节点数, 边数

//最小生成树算法,普里姆算法
void Prim()
{
Sum = 0;
int minDis;//当前生成树到每个节点的最小距离
memset(visit, false, sizeof(visit));
//从1号节点开始,记录当前生成树到每个节点的距离
for(int i=1; i<=n; i++)
dis[i] = MG[1][i];
visit[1] = true;
int pos;//记录每次找到的最短距离的节点
bool IsFound = true;//
//一共n个节点,最小生成树有n-1条边,所以有n-1次循环
for(int i=1; i<n; i++)
{
minDis = INF;
for(int j=1; j<=n; j++)
{
//从dis数组中找距离最短的
if(!visit[j] && dis[j] < minDis)
{
minDis = dis[j];
pos = j;
}
}
//如果没找到,则是剩下的节点中与当前生成树没有连通,跳出循环
if(minDis == INF)
{
IsFound = false;
break;
}
Sum += minDis;//权值增加
visit[pos] = true;//生成树“长大”
for(int j=1; j<=n; j++)
{
if(!visit[j] && dis[j] > MG[pos][j])
dis[j] = MG[pos][j];
}
}
if(IsFound)
cout<<Sum<<endl;
else
cout<<"-1"<<endl;
}

int main()
{
while(cin>>n>>m)
{
//矩阵初始化(嵌套循环)
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
{
if(i == j)
MG[i][j] = 0;
else
MG[i][j] = INF;
}
for(int i=0; i<m; i++)
{
int a, b, c;
cin>>a>>b>>c;
//避免边重复
if(MG[a][b] > c)
MG[a][b] = MG[b][a] = c;
}
Prim();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据结构 算法