道路を構築HDU 1102

免責事項:この記事はブロガーオリジナル記事です、ブロガーが転載URLを記載してください。https://blog.csdn.net/jiayizhenzhenyijia/article/details/89318519

トピックへのリンク:ポータル

問題の説明

そこ1からNまで番号が付けられているN村は、であり、あなたはすべての二つの村が相互に接続することができるように、いくつかの道路を構築する必要があります。我々は、AとBとの間の道路が存在する、または接続されているA及びC、及びCとB間の道路が存在するように村Cが存在する場合にのみ場合、2つの村のA及びBは、接続されていると言います。 

我々は、すべての村が接続され、構築されたすべての道路の長さが最小になるように、いくつかの道路のビルドで、いくつかの村や、あなたの仕事の間にいくつかの道路が既に存在していることを知っています。

入力

最初の行は、整数N(3 <= N <= 100)、村の数です。次いで、Nラインを来る、のi番目のN個の整数を含む、これらのN個の整数のj番目の距離で村iと村jの間(距離[1 1000]内の整数でなければなりません)。

次に、整数q(0 <= Q <= N *(N + 1)/ 2)があります。次いで、Qラインを来る、各ラインは、2つの整数を含む構築されている村aおよび村B間の道路を意味し、(<= N、B 1 <= A <)およびb。

出力

あなたは、出力ラインは、すべての道路の長さは、すべての村に接続されるように構築されるべきである整数を含有する必要があり、この値は最小値です。 

サンプル入力

3
0 990 692
990 0 179
692 179 0
1
1 2

サンプル出力

179

タイトル効果:N-都市、所与のn * N行列、i行目のマトリクス番号、jは都市iとjとの間の距離を示します。次いで、得られたQは、Qは、xとyの都市都市道路との間のデータ表現の列を有し得、すべての都市の円滑な流れの最小の長さは、道路を構築する必要があります。

クラスカル法:

#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;
}

 

おすすめ

転載: blog.csdn.net/jiayizhenzhenyijia/article/details/89318519