PTA 08-图7 公路村村通 (30分)
现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本。
输入格式:
输入数据包括城镇数目正整数NN(\le 1000≤1000)和候选道路数目MM(\le 3N≤3N);随后的MM行对应MM条道路,每行给出3个正整数,分别是该条道路直接连通的两个城镇的编号以及该道路改建的预算成本。为简单起见,城镇从1到NN编号。
输出格式:
输出村村通需要的最低成本。如果输入数据不足以保证畅通,则输出-1−1,表示需要建设更多公路。
输入样例:
6 15
1 2 5
1 3 3
1 4 7
1 5 4
1 6 2
2 3 4
2 4 6
2 5 2
2 6 6
3 4 6
3 5 1
3 6 1
4 5 10
4 6 8
5 6 3
输出样例:
12
/*
* 这题边数e <= 3*顶点数 不是稀疏图 故以邻接矩阵进行存储 采用prim算法。 (下面也写了个kruskal加最小堆的实现)
* findMin()函数找最小值可以用最小堆进行优化。(这里不用最小堆优化用了24ms~~ 用最小堆和kruskal写12ms- -!)
*/
#include "iostream"
using namespace std;
#define INF 999999
int map[][];
int n, m;
int lowCost[];
long ans = ;
int findMin() {
int minCost = INF;
int k, j;
for (k = , j = ; j <= n; j++) {
if (lowCost[j] && lowCost[j] < minCost) {
minCost = lowCost[j];
k = j;
}
}
return k;
}
int prim() {
for (int i = ; i <= n; i++) {
lowCost[i] = map[][i];
}
lowCost[] = ; /* 从序号为1的顶点出发生成最小生成树 */
for (int i = ; i < n; i++) { /* 生成树还需要收n-1个节点 */
int k = findMin(); /* 找到到生成树距离最短的节点 */
if (k) {
ans += lowCost[k];
lowCost[k] = ;
for (int j = ; j <= n; j++) { /* 更新当前的最小生成树 */
if (lowCost[j] && map[k][j] < lowCost[j]) {
lowCost[j] = map[k][j];
}
}
}
else {
return -;
}
}
return ans;
}
void init() {
cin >> n >> m;
for (int i = ; i <= n; i++)
for (int j = ; j <= n; j++) {
if (i == j) {
map[i][j] = ;
}
else {
map[i][j] = INF;
}
}
while (m--) {
int c1, c2, c3;
cin >> c1 >> c2 >> c3;
map[c1][c2] = map[c2][c1] = c3;
}
}
int main() {
init();
cout<<prim()<<endl;
}
/*
* kruskal加最小堆的实现(可能是数据量比较小吧~ 这个稠密图用krukal加了个最小堆跑的比前面的prim快了一倍)
*/
#include "iostream"
using namespace std;
#define INF 0
struct Node {
int s, e;
int cost;
}edge[];
int father[];
int Size = ;
int v, e;
void makeHeap() { /* 将数组调整成小顶堆 O(e)的时间复杂度 */
int child, parent;
Size = e;
edge[].cost = INF; /* 哨兵 */
int i = Size / ;
for (; i >= ; i--) {
Node temp = edge[i];
for (parent = i; parent * <= Size; parent = child)
{
child = parent * ; /* 先指向左孩子 */
if ((child != Size) && edge[child].cost > edge[child + ].cost) { /* 右孩子*/
child++;
}
if (temp.cost <= edge[child].cost) {
break;
}
else
edge[parent] = edge[child];
}
edge[parent] = temp;
}
}
Node deleteMinFromHeap() { /* 从小顶堆中删除元素 在调整成小顶堆 时间复杂度O(log e)*/
Node temp = edge[Size--];
Node minItem = edge[];
//cout << Size << endl;
int parent, child;
for ( parent = ; parent * <= Size; parent = child) {
child = parent * ;
if ((child != Size) && (edge[child].cost > edge[child+].cost)) {
child += ; /* 找左右孩子中较小者 */
}
if (temp.cost <= edge[child].cost) break;
else edge[parent] = edge[child];
}
edge[parent] = temp;
return minItem;
}
void init() {
// cout << "v--->" << v << endl;
for (int i = ; i <= v; i++)
father[i] = -; /* 初始化为当前树的节点数的相反数 */
}
int find(int x) { /* 查询根节点 */
if (father[x] <= -)
return x;
else
return father[x] = find(father[x]); /* 路径压缩 */
} void Union(int x, int y) {
x = find(x);
y = find(y);
if (father[x] < father[y]) { /* 按节点数大小进行归并 */
father[x] += father[y];
father[y] = x;
}
else {
father[y] += father[x];
father[x] = y;
}
}
int main() {
int ans = ;
cin >> v >> e;
for (int i = ; i <= e; i++) {
cin >> edge[i].s >> edge[i].e >> edge[i].cost;
}
makeHeap();
init();
int k = ;
for(int i = ;i <= e; i++) {
Node node = deleteMinFromHeap(); /* 总的复杂度 O(e * log v) */
int x = find(node.s); /*O(1)*/
int y = find(node.e);
if (x != y) {
ans += node.cost;
Union(node.s, node.e); /*O(1)*/
k++;
if (k == v) {
break;
}
}
}
if (k != v)
cout << - << endl;
else
cout << ans << endl;
return ;
}
PTA 08-图7 公路村村通 (30分)的更多相关文章
- PTA 7-1 公路村村通 (30分)
PTA 7-1 公路村村通 (30分) 现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本. 输入格式: 输入数据包括城镇数目正整数N ...
- pta08-图7 公路村村通 (30分)
08-图7 公路村村通 (30分) 现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本. 输入格式: 输入数据包括城镇数目正整数N ...
- pta 编程题21 公路村村通
其它pta数据结构编程题请参见:pta 题目 这道题考察最小生成树问题,用的是Prim算法. 和Dijkstra算法相比,没有了collect数组,因为dist[v] == 0就代表v被已收录. #i ...
- pat06-图6. 公路村村通(30)
06-图6. 公路村村通(30) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 现有村落间道路的统计数据表中,列出了有可能建设成标准公路的 ...
- 7-6 公路村村通(30 分) 【prime】
7-6 公路村村通(30 分) 现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本. 输入格式: 输入数据包括城镇数目正整数N(≤10 ...
- ACM程序设计选修课——Problem E:(ds:图)公路村村通(Prim)
问题 E: (ds:图)公路村村通 时间限制: 1 Sec 内存限制: 128 MB 提交: 9 解决: 5 题目描述 现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本, ...
- 7-10 公路村村通(30 分)(最小生成树Prim算法)
7-10 公路村村通(30 分) 现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本. 输入格式: 输入数据包括城镇数目正整数N(≤1 ...
- PTA 7-1 是否完全二叉搜索树 (30分)
PTA 7-1 是否完全二叉搜索树 (30分) 将一系列给定数字顺序插入一个初始为空的二叉搜索树(定义为左子树键值大,右子树键值小),你需要判断最后的树是否一棵完全二叉树,并且给出其层序遍历的结果. ...
- PTA二叉搜索树的操作集 (30分)
PTA二叉搜索树的操作集 (30分) 本题要求实现给定二叉搜索树的5种常用操作. 函数接口定义: BinTree Insert( BinTree BST, ElementType X ); BinTr ...
随机推荐
- 设置BootStrap导航条的高度
只要加上这段css就可以覆盖Bootstrap.css的代码,定制符合自己的样式 .navbar { min-height: 40px; } .nav > li > a { padding ...
- 关于如何学好游戏3D引擎编程的一些经验[转]
此篇文章献给那些为了游戏编程不怕困难的热血青年,它的神秘要我永远不间断的去挑战自我,超越自我,这样才能攀登到游戏技术的最高峰 ——阿哲VS自己 QQ79134054多希望大家一起交流与沟通 这篇文章是 ...
- Android常用的工具类(转)
主要介绍总结的Android开发中常用的工具类,大部分同样适用于Java.目前包括HttpUtils.DownloadManagerPro.ShellUtils.PackageUtils.Prefer ...
- .bat批处理脚本让cmd命令行提示符cd到工作目录 (转)
打开cmd,检查命令行提示符所在的默认位置(目录),进入该目录用notepad++创建一个文件,输入 @echo offrem 这个符号表示该行是注释.rem 进入f盘,需要先切换盘符,成功后才能进入 ...
- SecureCRT+WinSCP 共用 key pub 密钥 转换 ppk 登录ssh
使用SecureCRT生成的密钥,无法在WinSCP使用, 使用puttygen.exe无法直接转换,解决办法 1.使用大于等于SecureCRT6.5版本,来转换 记得放入私钥,不是pub公钥.然后 ...
- 浏览器因cookie设置HttpOnly标志引起的安全问题
1.简介 如果cookie设置了HttpOnly标志,可以在发生XSS时避免JavaScript读取cookie,这也是HttpOnly被引入的 原因.但这种方式能防住攻击者吗?HttpOnly标志可 ...
- hdu 3717
思路:二分答案,然后模拟消灭石头的过程: 如果单纯的暴力模拟的话,肯定会T的: 所以要用到一定的技巧来维护: 在网上看到大神们用O(n)的复杂度来优化,真心orz: 原理是这样的:用一个变量sum_2 ...
- asp.net DropDownList无刷新ajax二级联动实现详细过程
只适合新手制作DropDownList无刷新ajax二级联动效果: 数据库实现,添加两表如图:表1,pingpai,表2,type,具体数据库实现看自己的理解: //页面主要代码: <asp:S ...
- asp.net 弹出式日历控件 选择日期 Calendar控件
原文地址:asp.net 弹出式日历控件 选择日期 Calendar控件 作者:逸苡 html代码: <%@ Page Language="C#" CodeFile=&quo ...
- Spring事务传播机制
Spring在TransactionDefinition接口中规定了7种类型的事务传播行为,它们规定了事务方法和事务方法发生嵌套调用时事务如何进行传播,即协调已经有事务标识的方法之间的发生调用时的事务 ...