数据结构实验之图论六:村村通公路
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;
}
相关文章推荐
- 数据结构上机 【创建二叉树,并采用先中后序遍历,输出树高,度数为分别为0 1 2 的结点个数】
- 数据结构实验之图论二:基于邻接表的广度优先搜索遍历
- 数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历
- getchar,getch,scanf,gets,getche一群纠结的兄弟
- [数据结构JAVA版]集合
- 数据结构之内存---对和栈的区别
- 数据结构实验之图论七:驴友计划 最短路中最小花费
- 贪婪算法+小应用(调度问题)
- 《大话数据结构》之Kruskal算法
- 数据结构-使用数组作为环
- C#数据结构之队列(Quene)实例详解
- C#数据结构之堆栈(Stack)实例详解
- C#数据结构之双向链表(DbLinkList)实例详解
- PTA数据结构与算法题目集(中文) 函数题 (1)
- 数据结构和算法动态可视化
- 数据结构系列——Java后缀树实现代码
- 黑客攻击的入口--端口
- 数据结构系列——后缀树(附Java实现代码)
- 数据结构 — 树 与 二叉树、森林
- 【数据结构】 队列的应用举例——更好的学习和理解队列