杭电1102Constructing Roads

来源:互联网 发布:曼威网络 编辑:程序博客网 时间:2024/05/21 11:29

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
30 990 692990 0 179692 179 011 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;}


0 0
原创粉丝点击