HDOJ 1102 Constructing Roads
2016-01-08 19:49
344 查看
Constructing Roads
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 18371 Accepted Submission(s): 7021
[align=left]Problem Description[/align]
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.
[align=left]Input[/align]
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.
[align=left]Output[/align]
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.
[align=left]Sample Input[/align]
3 0 990 692 990 0 179 692 179 0 1 1 2
[align=left]Sample Output[/align]
179
[align=left]Source[/align]
kicc
[align=left]Recommend[/align]
Eddy
英文题,依旧是看了半天才理解题意,总觉得自己的阅读能力又上升了= =……
嗯,知识点是最小生成树。
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int per[101]; int Trush[101*101]; struct Dis { int start,end,dis,exist; }di[101*101]; bool cmp(Dis a,Dis b) { return a.dis<b.dis; } int Find(int r) { while(r!=per[r]) r=per[r]; return r; } int Judge(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 n,q,i,j,k,h,s,e; while(~scanf("%d",&n)) { memset(di,0,sizeof(di)); for(i=1;i<=n;i++) per[i]=i; for(i=1,k=0,h=0;i<=n;i++) { for(j=1;j<=n;j++) { if(i==j||i>j) { scanf("%d",&Trush[h]); h++; continue; } scanf("%d",&di[k].dis); di[k].start=i;di[k].end=j; k++; } } scanf("%d",&q); int sum=0; while(q--) { scanf("%d%d",&s,&e); for(i=0;i<k;i++) { if((s==di[i].start&&e==di[i].end)||(e==di[i].start&&s==di[i].end)) { di[i].exist=1; di[i].start=Find(di[i].start); di[i].end=Find(di[i].end); per[di[i].end]=di[i].start; break; } } } sort(di,di+k,cmp); for(i=0;i<k;i++) { if(di[i].exist) continue; if(Judge(di[i].start,di[i].end)) { sum+=di[i].dis; } } printf("%d\n",sum); } return 0; }
相关文章推荐
- 微信卡券核销
- 机器学习相关——协同过滤
- java 开关
- 深度学习和浅层学习 Deep Learning and Shallow Learning
- 喷水装置(一) OJ 6
- BZOJ 4396: [Usaco2015 dec]High Card Wins|贪心
- Android平台Camera实时滤镜实现方法探讨(十)--代码地址以及简介
- hadoop源码的简单解读
- 推荐系统绝对不会向你推荐什么
- C++ string substr()
- 10 归并两个有序链表
- 【Android】ViewPager实现Tab布局
- 周总结(一)
- 【原创译文】基于Docker和Rancher的超融合容器云架构
- 1月8日 作业
- 49.Group Anagrams
- 牛顿法 Newton Method
- 回文字符串切割问题
- SymmetricDS文档翻译--【Chapter 3. 具体配置(Configuration)[section C]】
- “猜你喜欢”是怎么猜中你心思的?