当前位置: 代码迷 >> 综合 >> Codeforces 731C Socks(并查集)
  详细解决方案

Codeforces 731C Socks(并查集)

热度:73   发布时间:2024-01-10 18:49:19.0

题意:给你n条袜子,一共有k种颜色,要求每天穿的两只袜子颜色相同,求需要最少改多少只袜子的颜色才能满足条件。

把同一天穿的两只袜子利用并查集放到一块,最后形成了一个一个集合,找出每个集合中哪个颜色的袜子最多,再把集合中其他颜色的袜子变成那个颜色,最后把每个集合所求的值加起来就是答案。

 
#include<bits/stdc++.h>
using namespace std;
int type[200005],pre[200005],num[200005];
int find(int x)
{if(pre[x]==x){return x;}else{return pre[x]=find(pre[x]);}
}
vector<int>v[200005];
map<int,int>map1[200005];
int main()
{int n,m,k,a,b,sum=0,ans=0;scanf("%d%d%d",&n,&m,&k);for(int i=1;i<=n;i++){scanf("%d",&type[i]);}for(int i=1;i<=n;i++){pre[i]=i;}while(m--){scanf("%d%d",&a,&b);int aa=find(a);int bb=find(b);if(aa!=bb){pre[bb]=aa;}}for(int i=1;i<=n;i++){v[find(i)].push_back(i);}for(int i=1;i<=n;i++){if(!v[i].size()) continue;for(int j=0;j<v[i].size();j++){map1[i][type[v[i][j]]]++;}int max1=0;for(int j=0;j<v[i].size();j++){max1=max(max1,map1[i][type[v[i][j]]]);}int x=v[i].size()-max1;ans+=x;}printf("%d\n",ans);return 0;
}