トピック
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を出力することです(それ自体がパスです)。したがって、減算する必要があります)