HDU 1102 Constructing Roads

题目链接:传送门

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

题目大意:有n个城市,给出一个n*n矩阵,矩阵中第i行第j个数表示城市i与j间的距离。再给出Q,有Q行数据表示x城市与y城市间已经有道路,求出,畅通所有城市需要建设的道路的最小长度。

Kruskal算法:

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
struct node
{
    int x,y,t;
}n[100500];//这里数组要开大,不然报运行超时,虽然不知道为啥
int m[1005];
int s,w;
bool cmp(node a,node b)
{
    return a.t<b.t;
}
int fin(int a)
{
    while(m[a]!=a)
        a=m[a];
    return a;
}
int main()
{
    int a,b,c,d,e,f,i,j;
    while(~scanf("%d",&s))
    {
        e=0;
    for(a=0;a<s;a++)
    {
        for(b=0;b<s;b++)
        {
            scanf("%d",&c);
            if(a>b)
            {
                n[e].x=a+1;
                n[e].y=b+1;
                n[e].t=c;
                e++;
            }
        }
    }
    sort(n,n+e,cmp);
    for(a=0;a<=s;a++)
        m[a]=a;
    scanf("%d",&f);
    while(f--)
    {
        scanf("%d %d",&b,&c);
        i=fin(b);
        j=fin(c);
        m[i]=j;
    }
    w=0;
    for(a=0;a<e;a++)
    {
        i=fin(n[a].x);
        j=fin(n[a].y);
        if(i!=j)
        {
            w+=n[a].t;
            m[i]=j;
        }
    }
    printf("%d\n",w);
    }
    return 0;
}

 

全部评论

相关推荐

感觉这一周太梦幻了,就像一个梦,很不真实~~~感觉这个暑期,我的运气占了99成,实力只有百分之一4.15上午&nbsp;腾讯csig&nbsp;腾讯云部门,面完秒进入复试状态4.16下午&nbsp;美团优选供应链部门,4.18上午发二面4.17晚上&nbsp;阿里国际一面,纯拷打,面完我都玉玉了4.18下午&nbsp;阿里国际二面,是我们leader面的我,很轻松~~4.18晚上&nbsp;约了hr面4.19上午&nbsp;hr面,下午两点口头oc4.19晚上&nbsp;意向书说起来我的暑期好像一次都没挂过~~~~~难道我是天生面试圣体?----------------------------------------------------------------------六个月前,我还是0项目0刷题,当时想的是先把论文发出来再去找实习。结果一次组会,老师打破了我的幻想(不让投B会,只让投刊或者A)我拿头投啊!!!然后就开始物色着找实习,顺便做完了mit的6.s081,但是基本上还是没刷过题目-----------------------------------------------------------------------11月&nbsp;&nbsp;一次偶然的机会,面进了某个耳机厂的手环部门,大概是做嵌入式的,用的是CPP。12月&nbsp;莫名其妙拿到了国创的面试机会,0基础四天速成java基础!居然也给我面过了hhhhh,可能是面试没写题吧入职国创后的几个月,一直没活,天天搁那看剧,都快忘了还有暑期实习这回事了~~~~命运的齿轮在2.26开始转动,因为这一天美团开了,我开始慌了,因为那时的我什么都不会。lc,八股,sql全部是0进度。然后就开始了女娲补天,上班刷题,下班继续做之前的开源,顺便学一学八股。3月到现在,lc也刷到快200了,一天最多提交了47次~~~~~~~~~~八股根据别人的面经总结和博客,写了快十万字的笔记~~~~~~~~~~简历上的实习经历和开源,也努力去深挖了,写了几万字的记录~~~~~~所以面试的时候,基本上都能cover了,面试官问到的基础基本都会,不基础的我就把他往我会的地方引。结果好像还不错,基本上每个面试官评价都挺好的emmmmmmmm
投递阿里巴巴等公司10个岗位
点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务