POJ-2421 Constructing Roads (最小生成树)

来源:互联网 发布:cdn网络节点 编辑:程序博客网 时间:2024/06/06 17:57
Constructing Roads
Time Limit: 2000MS Memory Limit: 65536KTotal Submissions: 25593 Accepted: 11207

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

30 990 692990 0 179692 179 011 2

Sample Output

179
#include <stdio.h>#include <algorithm>using namespace std;struct edge{int from, to, val;bool operator < (const edge& x) const{return val < x.val;}}e[11111];int p[11111], a[111][111];int findset(int x){return p[x] == x ? x : p[x] = findset(p[x]);}int main(){int n, num;scanf("%d", &n);for(int i = 1; i <= n; ++i){for(int j = 1; j <= n; ++j){scanf("%d", &a[i][j]);}}num = 0;for(int i = 1; i <= n; ++i){for(int j = i + 1; j <= n; ++j){e[++num].val = a[i][j];e[num].from = i;e[num].to = j;}}sort(e + 1, e + 1 + num);for(int i = 1; i <= n; ++i){p[i] = i;}int q, u, v, ans = 0;scanf("%d", &q);while(q--){scanf("%d %d", &u, &v);u = findset(u);v = findset(v);p[u] = v;}for(int i = 1; i <= num; ++i){u = findset(e[i].from);v = findset(e[i].to);if(u != v){p[u] = v;ans += e[i].val;}}printf("%d\n", ans);}/*题意:100个城市,城市之间已经有一些路了,现在需要再建一些使得所有城市联通,问最小代价。思路:最小生成树,先处理一下已经建边的集合,然后照常跑最小生成树即可。并查集维护一下。*/


阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 歌尽桃花番外谢 桃花水为什么腹泻那么快 三月桃花水阅读答案 桃花洞口水汪汪 喝桃花水减肥吗 水点桃花瓷器 喝桃花水有什么好处 桃花江 桃花江竹海景区旅游 桃花汤 桃花汤组成 桃花洞 初入桃花洞在线看 初入桃花洞弟二集 初入桃花洞弟 初入桃花洞手机版 初入桃花洞 出入桃花洞 妈妈的桃花洞 老师的桃花洞 姐姐的桃花洞 玉葡团之初入桃花洞 玉簿团之初入桃花洞 桃花涧旅游 桃花涧 桃花涧风景区 桃花夭夭 桃花渡 桃花渡简谱 桃花渡歌词 陈悦桃花渡 桃花前渡 桃花湖 桃花源记原文 桃花源 桃花源论坛新入口 陶渊明桃花源记 桃花源记恐怖 桃花源成年影院 thz2019桃花源论坛 桃花源景区