您的位置:首页 > 其它

Codeforces 731C Socks(并查集)

2016-10-17 17:31 671 查看
题意:给你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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: