#4 MLE并查集做法求调
  • 板块P1682 过家家
  • 楼主jubingkun
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/7/26 18:19
  • 上次更新2023/11/3 07:31:36
查看原帖
#4 MLE并查集做法求调
945545
jubingkun楼主2023/7/26 18:19

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
const int N = 251;
int n, m, q, k, ans = 1e9;
int f[N], cnt[N];
vector<int> v[N];
bool vis[N][N];
int findf(int k) {
	return f[k] == k ? k : f[k] == findf(f[k]);
}
int main() {
	ios::sync_with_stdio(0);
	cin >> n >> m >> k >> q;
	for (int i = 1; i <= n; i++)
		f[i] = i;
	for (int i = 1; i <= m; i++) {
		int a, b;
		cin >> a >> b;
		v[a].push_back(b);
	}
//	cout << "\n";
//	for (int i = 1; i <= n; i++) {
//		for (int j = 0; j < v[i].size(); j++) {
//			cout << v[i][j] << " ";
//		}
//		cout << "\n";
//	}
//	cout << "\n";
	for (int i = 1; i <= q; i++) {
		int a, b;
		cin >> a >> b;
		int x = findf(a), y = findf(b);
		if (x != y) {
			f[x] = y;
		}
	}
	for (int i = 1; i <= n; i++) {
		int x = f[i];
		for (int j = 0; j < v[i].size(); j++) {
			if (!vis[x][v[i][j]]) {
				cnt[x]++;
				vis[x][v[i][j]] = 1;
			}
		}
	}
	for (int i = 1; i <= n; i++)
		if (f[i] == i)
			ans = min(cnt[i], ans);
	ans = min(n, ans + k);
	cout << ans;
	return 0;
}
2023/7/26 18:19
加载中...