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

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

2015-11-27 18:13 316 查看


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



Time Limit: 1000MS Memory limit: 65536K


题目描述

当前农村公路建设正如火如荼的展开,某乡镇政府决定实现村村通公路,工程师现有各个村落之间的原始道路统计数据表,表中列出了各村之间可以建设公路的若干条道路的成本,你的任务是根据给出的数据表,求使得每个村都有公路连通所需要的最低成本。


输入

连续多组数据输入,每组数据包括村落数目N(N <= 1000)和可供选择的道路数目M(M <= 3000),随后M行对应M条道路,每行给出3个正整数,分别是该条道路直接连通的两个村庄的编号和修建该道路的预算成本,村庄从1~N编号。 


输出

输出使每个村庄都有公路连通所需要的最低成本,如果输入数据不能使所有村庄畅通,则输出-1,表示有些村庄之间没有路连通。 


示例输入

5 8
1 2 12
1 3 9
1 4 11
1 5 3
2 3 6
2 4 9
3 4 4
4 5 6



示例输出

19



提示

#include <bits/stdc++.h>

using namespace std;
const int maxn = 1010;
int Map[maxn][maxn];
int n, m;
int F[maxn];
int eveco[maxn];
bool vis[maxn];
int Find(int x)
{
return x == F[x] ? x : F[x] = Find(F[x]);
}
void Link(int u, int v)
{
int f1 = Find(u);
int f2 = Find(v);
if(f1 != f2)
F[f2] = f1;
}

void Init(int n)
{
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] = 0x3f3f3f3f;
}
}
for(int i = 1; i <= n; i++)
F[i] = i;
}

bool Judge(int n)
{
int num = 0;
for(int i = 1; i < n; i++)
if(F[i] == i)
num++;
// cout<<num<<endl;
if(num == 1)
return true;
return false;
}

int Prim()
{
memset(vis, false, sizeof(vis));
int cost = 0;
for(int i = 1; i <= n; i++)
eveco[i] = Map[1][i];
eveco[1] = 0, vis[1] = true;
for(int i = 1; i < n; i++)
{
int pos;
int m = 0x3f3f3f3f;
for(int j = 1; j <= n; j++)
{
if(!vis[j] && m > eveco[j])
m = eveco[j], pos = j;
}
if(m == 0x3f3f3f3f)
break;
vis[pos] = true;
// cout<<"m = "<<m<<endl;
cost += m;
for(int j = 1; j <= n; j++)
{
if(!vis[j] && eveco[j] > Map[pos][j])
eveco[j] = Map[pos][j];
}

}
return cost;
}
int main()
{
int u, v, w;
while(cin>>n>>m)
{
Init(n);

for(int i = 0; i < m; i++)
{
cin>>u>>v>>w;
Map[u][v] = Map[v][u] = w;
Link(u, v);
}

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