ZCMU-4940ブロックされていないプロジェクト

トピック

ZCMU-4940のこの
質問は、実際にはユニオンチェックセットのアプリケーションです。記録してください。

4940:ブロック解除されたプロジェクト
制限時間:1秒メモリ制限:32 MB
送信:73解決済み:48
[送信] [ステータス] [ウェブボード]
説明
州は都市の交通状況を調査し、リストされている既存の都市道路の統計表を取得します。テーブルの中町に直結する各道路。州政府の「ブロックされていないプロジェクト」の目標は、州内の任意の2つの町の間の交通を可能にすることです(ただし、道路を介して間接的に到達可能である限り、必ずしも道路で直接接続されている必要はありません)。少なくともいくつの道路を建設する必要があるか尋ねてください。

入力
テスト入力には、いくつかのテストケースが含まれています。各テストケースの最初の行は、町の数N(<1000)と道路の数Mの2つの正の整数を示します。後続のM行はMの道路に対応し、各行は正の整数のペアを示します。道路で直接つながっている2つの町の数。簡単にするために、町には1からNまでの番号が付けられています。
注:2つの都市間に複数の道路が存在する可能性があるため、
3 3
1 2
1 2
2 1の入力
も有効です
。Nが0の場合、入力は終了し、ユースケースは処理されません。

出力
テストケースごとに、1行に建設する必要のある道路の最小数を出力します。

サンプル入力

5 3
1 2
3 2
4 5
0

サンプル出力

1

ACコード

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1005;
typedef long long ll;
int f[maxn];
int find(int k){
    
    
    if(f[k]==k)return k;
    else return f[k] = find(f[k]);
}
int main()
{
    
    

    int n,m;
    int x,y;
    int ans;
    while(cin>>n){
    
    
        if(n==0)break;

        ans = 0;
        for(int i=1;i<=n;i++)f[i] = i;
        cin >> m;
        while(m--){
    
    
            cin >> x >> y;
            int fa = find(x);
            int fb = find(y);
            if(fa!=fb)f[fa] = fb;
        }
        for(int i=1;i<=n;i++)if(i==f[i])ans++;
            cout << ans - 1 << endl;
    }
    return 0;
}

アイデア

この質問の考え方は非常に明確です。データを読み込んで、同じボス(ルートノード)があるかどうかを確認することです。同じでない場合は、ルートノードを直接同期して、最後に統計を実行します。注意する必要があるのは、ans-1を出力することです(それ自体がパスです)。したがって、減算する必要があります)

おすすめ

転載: blog.csdn.net/DAVID3A/article/details/114328130