高速道路(最小スパニングツリー)

Flatopiaの島国は完全に平坦です。残念ながら、Flatopiaには一般公道を持っていません。だから、トラフィックはFlatopiaでは困難です。Flatopian政府はこの問題を認識しています。彼ら高速道路システムを離れることなく、町の任意のペアの間で駆動することが可能になるように、いくつかの高速道路を建設する計画です。
latopian町は各高速道路は正確に2つの町を結ぶ1からNまで番号が付けられています。すべての高速道路は直線に従ってください。すべての高速道路は両方向に使用することができます。高速道路を自由互いに交差することができるが、ドライバは、両方の高速道路の端に位置する町で、高速道路を切り替えることができます。彼はFlatopian政府が構築される最長の高速道路の長さを最小限にしたいと考えています。しかし、彼らはすべての町は、他のすべての町から高速道路、到達可能であることを保証します。
入力
入力の最初の行は、多くのテストケースは、その後どのように伝える整数Tであり、
それぞれの場合の最初の行は、Nの整数(3 <= N <= 500)であり、村の数です。次に、N個の整数を含むi番目そのうち、Nラインを来て、これらN個の整数のj番目村iと村jの間(距離は[1、65536]内の整数でなければならない)距離です。各テストケースの後に空行があります。
出力

各テストケースに対しては、出力ラインは、最も長い道路の長さは、すべての村に接続されるように構築されるべきである整数を含有する必要があり、この値は最小値です。
サンプル入力1

3
0 990 692
990 0 179
692 179 0
サンプル出力
692
イタリアその:修理道路、聯通のさまざまな場所への国は、最長辺の長さが最短に尋ねます。
アイデア:最小スパニングツリーのプリムのアルゴリズム。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int inf=1000000000;
int n;
int map[550][550];
int dis[550];
int vis[550];
void prim()
{
    int sum=0;
    for(int i=1; i<=n; i++)
    {
        dis[i]=map[1][i];
        vis[i]=0;
    }
    vis[1]=1;
    dis[1]=inf;
    int biao;
    for(int i=2; i<=n; i++)
    {
        biao=1;
        for(int j=2; j<=n; j++)
        {
            if((!vis[j])&&dis[j]<dis[biao])
            {
                biao=j;
            }
        }
        vis[biao]=1;
        for(int j=1; j<=n; j++)
        {
            if(!vis[j]&&dis[j]>map[j][biao])
                dis[j]=map[j][biao];
        }
    }
    for(int i=2; i<=n; i++)
        if(dis[i]>sum)
            sum=dis[i];
    cout<<sum<<endl;
}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        cin>>n;
        for(int i=1; i<=n; i++)
            for(int j=1; j<=n; j++)
                cin>>map[i][j];
        prim();
    }
    return 0;
}
公開された12元の記事 ウォンの賞賛1 ビュー191

おすすめ

転載: blog.csdn.net/csx_zzh/article/details/105129260