Constructing Roads

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 19847    Accepted Submission(s): 7594

Problem Description
There are N villages, which are numbered from 1 to N, and you should build some roads such that every two villages can connect to each other. We say two village A and B are connected, if and only if there is a road between A and B,
or there exists a village C such that there is a road between A and C, and C and B are connected.




We know that there are already some roads between some villages and your job is the build some roads such that all the villages are connect and the length of all the roads built is minimum.
 
Input
The first line is an integer N (3 <= N <= 100), which is the number of villages. Then come N lines, the i-th of which contains N integers, and the j-th of these N integers is the distance (the distance should be an integer within
[1, 1000]) between village i and village j.



Then there is an integer Q (0 <= Q <= N * (N + 1) / 2). Then come Q lines, each line contains two integers a and b (1 <= a < b <= N), which means the road between village a and village b has been built.
 
Output
You should output a line contains an integer, which is the length of all the roads to be built such that all the villages are connected, and this value is minimum.

 
Sample Input
3
0 990 692
990 0 179
692 179 0
1
1 2
 
Sample Output

179

首先将已有的顶点放入集合中,然后再kruskal


#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std; struct node {
int u, v, w;
}edge[10010]; #define mem(a) memset(a, 0, sizeof(a))
int par[110];
int cmp(node a, node b) {
return a.w < b.w;
} int find(int a) {
if (a != par[a]) return find(par[a]);
else return a;
} int kruskal(int n, int num) {
int ans = 0;
sort(edge, edge+num, cmp); for (int i = 0; i<num; i++) {
int x = edge[i].u, y = edge[i].v;
x = find(x), y = find(y);
if (x != y) {
ans += edge[i].w;
par[y] = x;
}
}
return ans;
} int main() {
int n;
while (cin >> n) {
mem(edge);
mem(par);
int num = 0;
for (int i = 1; i<=n; i++) {
for (int j = 1; j<=n; j++) {
int k;
cin >> k;
if (i >= j) continue;
edge[num].u = i;
edge[num].v = j;
edge[num++].w = k;
}
}
for (int i = 1; i<=n; i++) par[i] = i;
int q;
cin >> q;
while (q --) {
int x, y;
cin >> x >> y;
x = find(x);
y = find(y);
par[x] = y;
}
cout << kruskal(n, num) << endl;
}
return 0;
}

最新文章

  1. 【java开发】ubuntu常用命令及环境搭建
  2. Install PIL with Jpeg support on Raspbian Jessie
  3. C#使用HttpWebRequest 进行请求,提示 基础连接已经关闭: 发送时发生错误。
  4. 在MySQL中,如何计算一组数据的中位数?
  5. EF唯一索引
  6. vuejsLearn---通过手脚架快速搭建一个vuejs项目
  7. Android之TabHost布局(转)
  8. mongo复习
  9. Deferred Shading(延迟渲染)
  10. BZOJ 1057 棋盘制作
  11. Python主要模块和常用方法简览
  12. Vim实用小技巧
  13. Web设计思想——渐进增强
  14. java 读取excel
  15. 原生js中实现全选和反选功能
  16. js var 以及 let 的差异
  17. 量化投资与Python之NumPy
  18. [js]Object.defineProperty等几个js特殊方法
  19. log4j2笔记 #01# Architecture
  20. git log乱码显示

热门文章

  1. (精选)Xcode极速代码,征服Xcode,xcode插件
  2. Visual Studio Code 快捷键大全(Windows)
  3. ListView用法总结C#
  4. Panel控件的使用
  5. Cat 跨线程之 TaggedTransaction 用法和原理分析
  6. INITTAB 配置文件
  7. Jmeter3.2版本中Generating Report Dashboard功能浅析
  8. JavaScript的DOM编程--12--innerHTML属性
  9. [Android游戏开发]游戏框架的搭建
  10. 一张图,理解JAVA体系结构、运行机制、JVN运行机制、Java平台(初学)