AtCoder

ABC049 D問題(連結)を解く

AtCoder_ABC049_D

AtCoder が提供しているABC(AtCoder Beginner Contest)049 D問題をC++で解いてみました。ABC049は、2016年12月10日21:00に実施されました。

AtCoder の紹介はこちらに、プログラミングの方針はこちらに記事があります。

D問題 連結(Difficulty : 1996)

問題の詳細は、リンク先をご覧ください。

ABC049 D問題 連結

UnionFind を使う典型問題です。AtCoder Problems による Difficulty は 1996 でした。

解答案

C++ プログラム例(ABC049D)

道路で連結している都市を UnionFind 木 road に登録します(11ー16行目)。同じように、鉄道で連結している都市を UnionFind 木 rail に登録します(17ー22行目)。

各都市で道路で連結している根(road.leader())と鉄道で連結している根(rail.leader())の組み合わせをカウントして、その結果を出力します。

実装は、ACL(AtCorder Library)を使いました。以下が、C++プログラムです。

#include <bits/stdc++.h>
#include <atcoder/dsu>
using namespace std;
using namespace atcoder;

int main()
{
	int n, k, L;
	cin >> n >> k >> L;

	dsu road(n + 1);
	for (int i = 0; i < k; ++i) {
		int p, q;
		cin >> p >> q;
		road.merge(p, q);
	}
	dsu rail(n + 1);
	for (int i = 0; i < L; ++i) {
		int r, s;
		cin >> r >> s;
		rail.merge(r, s);
	}

	map<pair<int, int>, int> m;
	for (int i = 1; i <= n; ++i) {
		++m[make_pair(road.leader(i), rail.leader(i))];
	}

	for (int i = 1; i <= n; ++i) {
		cout << m[make_pair(road.leader(i), rail.leader(i))] << " \n"[i == n];
	}

	return 0;
}

AC(Accepted=正しいプログラム)と判定されました。

最後に

過去の ABC には、適切な難易度の典型問題が多く出題されていると感じます。

引き続き ABC の問題を紹介していきます。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA