(KEI)2183.ヤギ道路(道路)クラスカル最小スパニングツリー&互いに素なセット] +

(ファイルIO):入力:road.in出力:road.out
制限時間:1000msのスペースの制約:131072キロバイトの特定の制限
後藤ProblemSet


タイトル説明は
デモ特色羊の村の検査終了後、検査チームは、学校の安全性への子羊に影響を与える、道路羊の村、老朽化の道を再構築する必要性を感じました。
村の建設チームは、建設プログラムを計画し、測定距離を始め整理、いくつかの建物間の道路を構築するための現実的な選択肢の合計となっています N N 建物、および M M 枚オプションの道。これらの道路は保証されます N N 建物に接続されています。
最終的なプログラムは、羊の村は、世界で最も豪華なすべての大理石の道を構築したいと考え、道はシームレスな方法で、双方向のトラフィック、およびワンピースすることができます。この設計要件を実現するためには、自作の大理石の工場に必要です!
難易度の大理石の工場に構築された彼らのニーズは、大理石の生産の最大の長さに応じて設計されなければならないこと。大理石の工場は、その設計限界を超えていない任意の長さを生成することができます。長さの例については、設計 100 100 植物は、製造することができます 100 90 100,90 大理石の長さ等が、の長さを生成することができません 101 101 大理石。
羊の村の予算が限られている、私は可能な限り小さく、プラントの設計サイズを作り、あなたが計画に道路スキームを助けることを願って、そしてあなたはそれが村の羊のすべてに接続することができ大理石の建物を作り出すことができることを保証することができます。最小デザインサイズの植物の値。


入力
の最初の行に2つの整数を N N M N M、N Mが道路の数を構築することができている、村の羊における建物の数を表します。
M M ライン、各ライン3つの整数 A i B i 愛、バイ C i そこ 、建物から発現 A i 人工知能 、建物 B i とともに 、長さを構築することができます C i そこ の道。
建物からその番号に注意してください。 1 1 N N 、二つの建物の間に道路の数であってもよいです。

出力
最小デザインサイズ大理石工場出力。


サンプル入力
3 3
1 2 100
2 101 3
。1. 3 99

サンプル出力
100


データ範囲の制限
30 30 データの% N < = 10 N 1 < = M < = 100 N <= 10、N-1 <= M <= 100
100 100 データの% 1 < = N < = 2000 N 1 < = M < = 10000 1 < = A i B i < = N 1 <= N <= 2000、N-1 <= M <= 10000,1 <=愛、バイ<= N 1 < = C i < = 1000000000 1 <= CI <= 1000000000


ヒント
長いの建設などとして、 1 1 2 2 、および 1 1 3 3 道路、それは作ることができます 3 3 番目の建物互いに通信、およびのみ最大 100 100 、建築設計の唯一の規模 100 100 大理石工場、長さにして製造することができます 100 100 99 99 大理石。


アイデアの解決
木クラスカルの髪を最小全域を、蓄積・パスと最大値を選択するには、右端になります。(Iは互いに素なセットを使用しました)


コード

#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<algorithm>
#include<iomanip>
#include<cmath>
using namespace std;
int n,m,k,fa[2010],xx,yy,ans;
struct c{
    int x,y,z;
}a[10010];
bool cmp(const c&l,const c&r)
{
    return l.z<r.z;
}
int father(int h)
{
    while(h!=fa[h])
        h=fa[h];
    return h;
}
int main(){
    freopen("road.in","r",stdin);
    freopen("road.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++)
        scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z);
    sort(a+1,a+m+1,cmp);
    for(int i=1;i<=n;i++)
        fa[i]=i;
	for(int i=1;i<=m;i++)
	{
        xx=father(a[i].x);
        yy=father(a[i].y);
        if(xx!=yy)
        {
            ans=max(ans,a[i].z);
            fa[xx]=yy;
        }
    }
	printf("%d",ans);
}

公開された119元の記事 ウォンの賞賛8 ビュー4899

おすすめ

転載: blog.csdn.net/kejin2019/article/details/105162722