题目:http://codeforces.com/contest/731/problem/C
思路:并查集处理出哪几堆袜子是同一颜色的,对于每堆袜子求出出现最多颜色的次数,用这堆袜子的数目减去该值即为这堆袜子需要修改的颜色数,用同样的方法处理每堆求和即可。
#include<bits/stdc++.h>
using namespace std;
int f[],c[];
map<int,map<int,int> > mp;
int getf(int x){
if(f[x] == x)
return x;
else
return f[x] = getf(f[x]);
}
void merge(int u,int v){
int a = getf(u);
int b = getf(v);
if(a != b)
f[b] = a;
}
int main(){
int n,m,k;
cin >> n >> m >> k;
for(int i = ;i<=n;i++){
f[i] = i;
scanf("%d",&c[i]);
}
int l,r;
while(m--){
scanf("%d%d",&l,&r);
merge(l,r);
}
for(int i = ;i<=n;i++){
mp[getf(i)][c[i]]++;
}
int ans = ;
for(map<int,map<int,int> >::iterator i = mp.begin();i!=mp.end();i++){
int sum = ,mx = ;
for(map<int,int>::iterator j = i->second.begin();j!=i->second.end();j++){
mx = max(mx,j->second);
sum += j->second;
}
ans += sum-mx;
}
cout << ans;
return ;
}