题目链接:点击这里
题意:给出n只袜子的颜色,每天选择两只袜子,每次能把一只袜子染色。问最少染色几只袜子能使的每天的袜子颜色一样。
给每天穿的两只袜子连边,很显然一个分量的袜子要一起考虑,并查集维护分量就好了。然后搜出最多的颜色,把分量的点都染成这个颜色即可。
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
#define maxn 200005
int fa[maxn], color[maxn];
#define find Find
int find (int x) {
return fa[x] == x ? fa[x] : fa[x] = find (fa[x]);
}
int n, m, k;
vector <int> a[maxn];
int num[maxn];
int main () {
cin >> n >> m >> k;
for (int i = 0; i <= k; i++) a[i].clear ();
for (int i = 1; i <= n; i++) cin >> color[i], fa[i] = i;
for (int i = 0; i < m; i++) {
int u, v;
cin >> u >> v;
int p1 = find (u), p2 = find (v);
if (p1 != p2) {
fa[p1] = p2;
}
}
for (int i = 1; i <= n; i++) {
a[find (i)].push_back (i);
}
memset (num, 0, sizeof num);
int ans = 0;
for (int i = 1; i <= n; i++) {
int sz = a[i].size (), Max = 0;
for (int j = 0; j < sz; j++) {
int id = a[i][j];
num[color[id]]++;
Max = max (Max, num[color[id]]);
}
ans += sz-Max;
for (int j = 0; j < sz; j++) {
int id = a[i][j];
num[color[id]]--;
}
}
cout << ans << "\n";
return 0;
}