杭电1102Constructing Roads
2015-08-11 17:42
211 查看
Constructing Roads
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 17154 Accepted Submission(s): 6512
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
最小生成树,算是个模板题吧,那测试数据说,就是说有3个村庄,
第一个到第1个距离是0,第一个到第二个为990,第一个到第三个为692;
第二个到第一个是990,第二个到第二个是0,第二个到第三个是179;
第三个到第一个是692,第三个到第二个是179,第三个到第三个是0;
已经有1条路;
1到2通了路;
问把三个村庄连接起来,还需要最短修多长的路。
思路:已经修过的记为0;
附ac代码:
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; struct node { int start; int end; int cost; }t[10010]; int cmp(node a,node b) { return a.cost<b.cost; } int per[1000]; int find(int x) { int r=x; while(r!=per[r]) r=per[r]; return r; } int join(int x,int y) { int fx=find(x); int fy=find(y); if(fx!=fy) { per[fx]=fy; return 1; } return 0; } int main() { int m,n,i,j,k,l,x,y; int a[101][101]; while(scanf("%d",&n)!=EOF) { for(i=0;i<1000;i++) per[i]=i; k=0; for(i=0;i<n;i++) for(j=0;j<n;j++) { t[k].start=i+1;//start等于第一维+1; t[k].end=j+1;//end等于 第二维加1; scanf("%d",&a[i][j]); t[k].cost=a[i][j]; k++; } scanf("%d",&l); while(l--) { scanf("%d%d",&x,&y); for(i=0;i<k;i++) if(t[i].start==x&&t[i].end==y)//加一个查找,找到的话,当前的花费就变为0; { t[i].cost=0; break; } } sort(t,t+k,cmp); int sum=0; for(i=0;i<k;i++) { if(join(t[i].start,t[i].end)) sum=sum+t[i].cost; } printf("%d\n",sum); } return 0; }
相关文章推荐
- 详解图的应用(最小生成树、拓扑排序、关键路径、最短路径)
- 最小生成树算法之Prim算法
- 最小生成树算法——Prim和Kruskal算法的实现
- Data Structure - Week 15
- poj 2485 Highways
- Kruskal 最小生成树
- 最小生成树
- 杭电1870 愚人节的礼物
- 关于杭电1405 The Last Practice 的问题
- hdu-1103 模拟题。
- hdu-1022 栈的应用。
- hdu-1247 简单map的应用。(字典树)
- hdu-1251 字典树公共前缀。
- hdu-1075 map映射表的应用。
- 杭电1004
- 杭电1005
- 杭电1008
- 图的最小生成树学习笔记
- c++编写藏手帕问题
- 杭电oj-1003