トピック_冬のトレーニングソリューション_H上の3つの質問 - 交通プロジェクトスムース

タイトル

都市交通、都市部の道路の地方の調査では、既存のテーブル、各道路が直接接続市町テーブルのリストを取得します。ターゲット州政府「円滑な交通プロジェクト」は、任意の2つの町の間に州が(限り、あなたは道を介して間接的に相互に到達できるように、必ずしも直接道路に接続されていない)トラフィックを実装することができますようにすることです。最小も構築する必要がありますどのように多くの道路尋ねましたか?
入力
テスト入力には、いくつかのテストケースが含まれています。各テストケースは、N(<1000)の町の数であり、最初の2つの正の整数の行を所定の道路番号Mされ、次のMパスに対応するM個の行は、各列は、正の整数の組が与えられ、それぞれ、数直接通信経路における2つの町。簡単にするため、町は1からNまでの番号
注:道路の数が2つの都市の間で通信することができる、すなわち、
3 3
1 2
1 2
2 1
この入力が有効である
Nが0である場合、入力端、ユースケースが処理されません。
出力
テストケースごとに、また列に構築する必要があり、道路の出力最小数。
入力サンプル
4 2
。1 3
4 3
3 3
1 2
。1 3
2 3
。5 2
1 2
3 5
999 0
0
出力例
。1
0
2
998

巨大な入力は、scanfのが推奨されます。

効果の対象に

ありn点、m個の道路、プラスの選択肢のカップルが及びn個の点の最小値を接続させるように頼ま二十から二

問題の解決策

互いに素セットテンプレート

コード

#include <iostream>

using namespace std;
const int N = 1010;
long long n,m;
int p[N];
void init()
{
	for(int i = 1; i<=n; i ++)
	p[i] = i; 
}
int find(int x)
{
	if(x == p[x])return x;
	return p[x] = find(p[x]);
}
int main()
{
	while(scanf("%lld",&n)&&n)
	{
		scanf("%lld",&m);
		init();
		for(long long i = 1; i <= m; i ++)
		{
			int a,b;
			scanf("%d%d",&a,&b);
			if(find(a) == find(b))continue;
			else if(find(a) > find(b))swap(a,b); //保证find(a)<=a
			p[find(b)] = find(a);
		}
		int cnt = 0;
		for(int i = 2; i <= n; i ++)
		{
			if(1 != find(i))
			{
				cnt ++;
				p[find(i)] = 1;
			}
		}
		printf("%d\n",cnt);
	}
	return 0;
}
公開された13元の記事 ウォンの賞賛0 ビュー131

おすすめ

転載: blog.csdn.net/m0_46185124/article/details/103979428