ural 1982. Electrification Plan 并查集
2015-08-20 17:53
253 查看
题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1982
题意描述:给定N个点,其中K个点是有电的,再给定N*N个彼此之间的距离,求让所有点通电的最小花费;
思路大致是用一个虚点连接这K个有电的点,抽象成一个最小生成树模型,或用并查集的方法从最短边开始迭代;
直接上AC代码:
题意描述:给定N个点,其中K个点是有电的,再给定N*N个彼此之间的距离,求让所有点通电的最小花费;
思路大致是用一个虚点连接这K个有电的点,抽象成一个最小生成树模型,或用并查集的方法从最短边开始迭代;
直接上AC代码:
#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <stdio.h> #include <string> #include <algorithm> #include <vector> #include <queue> #include <cmath> #include <map> using namespace std; struct Node{ int a, b; int cost; }; bool cmp(Node a, Node b){ return a.cost < b.cost; } vector<int>parent; vector<Node>rout; int getParent(int n){ if (n == parent )return n; else if (parent == -1)return -1; else return parent = getParent(parent ); } bool link(int x, int y){ int a = getParent(x); int b = getParent(y); if (a != b){ if (a < b) parent[b] = a; else parent[a] = b; return true; } return false; } void func(){ int n, k; cin >> n >> k; for (int i = 0; i < n; i++) parent.push_back(i); int num; for (int i = 0; i < k; i++){ cin >> num; parent[num - 1] = -1; } int len = n*n; Node node; for (int i = 0; i < n; i++){ for (int j = 0; j < n; j++){ int cost; cin >> cost; node.a = i; node.b = j; node.cost = cost; rout.push_back(node); } } sort(rout.begin(), rout.end(), cmp); int ans = 0, cost = 0; for (int i = 0; i < len; i++){ if (link(rout[i].a, rout[i].b)) ans += rout[i].cost; } cout << ans << endl; } int main(){ freopen("out.txt", "w", stdout); freopen("in.txt", "r", stdin); func(); }
相关文章推荐
- 树莓派常用软件安装
- C# 中的委托和事件
- 浅谈Spring事务隔离级别
- Swift学习笔记(十四)可选链
- 导弹防御塔(missble)题解
- 图床爬虫
- jQuery的ajax返回html类型不能获取片段html代码
- 理解几个网络硬件(调制解调器、路由器、交换机)的基本作用
- Demo
- 奇奇怪怪的正则表达式
- C#停止线程的方法
- 初步篇11算术运算符与算术表达式项目4玩数字
- Android-Volley网络通信框架(volley 例子:电影列表)
- Android Hal 分析
- 大型分布式数据库集群的研究
- hdu1996汉诺塔VI
- uitextfiled 输入 过滤
- Linux strace命令
- Java开发者易犯错误Top10
- java--continue与break的使用