D.調和グラフ(Codeforcesラウンド#600(本部2))(互いに素セット思考+)

D.調和グラフ(Codeforcesラウンド#600(本部2))(互いに素セット思考+)

ここに画像を挿入説明
ここに画像を挿入説明

入力

14 8
1 2
2 7
3 4
6 3
5 7
3 8
6 8
11 12

出力

1

入力

200000 3
7 9
9 8
4 5

出力

0

例1:
ここに画像を挿入説明

問題の解決策

もしそこに 1 - n個 1-N パス、次いで 1 - n個 1-N 通信ブロックは到達することができなければなりません 2 3 4 ... 11 2,3,4 ... 11 全ての点。そして、もしおよび 1 1 アタッチメントの最大点があります 7 7 だから、 1 - 7 1-7 通信し、ブロックのみ 2 3 4 5 6 2,3,4,5,6 ラインに接続されています。したがって、我々は維持します リットル A R LAR の通信を流れる電流内のすべてのブロックの最大値未満で見つけるだけ必要 リットル A R LAR この点はその一部であるマイナスこれらの答えの中で効果的なので、タイトルがすでに、いくつかのエッジを与えるので、エッジが、ここにあることを説明します。

コード

#include <bits/stdc++.h>
using namespace std;
const int N = 200020;

int res;
int lab[N];
int n, m;

int find(int x) {
	return lab[x] < 0 ? x : lab[x] = find(lab[x]);
}

void join(int x, int y) {
	x = find(x); y = find(y);
	if (x == y) return;
	if (x < y) swap(x, y);
	res++;
	lab[y] = x;
}

int main() {
	//freopen("in.txt", "r", stdin);
	ios_base::sync_with_stdio(false); cin.tie(NULL);

	memset(lab, -1, sizeof lab);

	cin >> n >> m;
	res = 0;
	for (int i = 1; i <= m; ++i) {
		int u, v; cin >> u >> v;
		join(u, v);
	}

	int comp = 0, lar = find(1);
	for (int i = 2; i <= n; ++i) {
		if (i <= lar) ++comp;
		lar = max(lar, find(i));
	}

	cout << comp - res << endl;

	return 0;
}
公開された163元の記事 ウォン称賛54 ビュー30000 +

おすすめ

転載: blog.csdn.net/weixin_42856843/article/details/103115497