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

2144-数据结构实验之图论九:最小生成树

2017-12-07 17:13 429 查看
#include <iostream>
#include <cstdio>
#include <cstring>
#define MAX 0x3f3f3f3f

using namespace std;

int map[1123][1123];
int vis[1123];
int lowcost[1123];
int flag, sum;

void prim_MST(int n)
{
flag = 0;
sum = 0;

int k = 1;
for(int i = 1; i <= n; i++)
{
lowcost[i] = map[i][1]; /// 初始化
}
vis[1] = 1;
for(int i = 2; i <= n; i++)
{
int t = MAX;
for(int j = 1; j <= n; j++)
{
if(!vis[j] && t > lowcost[j]) /// 找到点未访问且权值最小的边
{
t = lowcost[j];
k = j; /// 记录该点
}
}
if(t == MAX) /// 没有符合条件的点即此图不连通
{
//cout << "-1" << endl;
flag = 1;
return ;
}

vis[k] = 1;
sum+=t; /// 权值累加

for(int j = 1; j <= n; j++)
{
if(!vis[j] && map[j][k] < lowcost[j]) /// 如果此时点未访问且权值小于此时lowcost的值
{
lowcost[j] = map[j][k]; /// 更新
}
}
}
}

int main()
{
int n, m, cost;

while(cin >> n >> m)
{

///map初始化为无穷大,不是初始化为0;
for(int i = 1;i <= n;i++)
{
for(int j = 1;j <= n;j++)
{
if(i == j)
map[i][j] = 0;
else
map[i][j] = MAX;
}
}
memset(vis, 0, sizeof(vis));

while(m--)
{
int u, v;
cin >> u >> v >> cost;
if(map[u][v] > cost) /// 窝草 重边是什么鬼!!!坑死了!!!!QAQ
{
map[u][v] = map[v][u] = cost;
}
}
prim_MST(n);

if(!flag)
{
cout << sum << endl;
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: