并查集【CF731C】Socks
2024-09-03 15:10:51
Description
有\(n\)只袜子,\(k\)种颜色,在\(m\)天中,问最少修改几只袜子的颜色,可以使每天要穿的袜子颜色相同。
Input
第一行\(n,m,k\)分别对应题目描述。
接下来\(m\)行每行两个整数\(l_i,r_i\)表示第\(i\)天要穿的两只袜子的编号。
Output
一个整数,代表最小要修改几只袜子的颜色。
首先,对于每一天要穿的袜子,我们加入同一个并查集。(这个很明显吧)
如果有一只袜子需要被穿多次的话,
显然我们会将其染成当前联通块中包含袜子最多的一种颜色。
我们用\(vector\)维护每个联通块中的袜子的颜色。
再开\(vis\)数组维护每种袜子的出现次数。(注意要清空)
每次我们累加的答案就是\(size-mx\)
其中\(size\)为联通块大小,\(mx\)为颜色相同的最多的袜子的个数。
代码
#include<cstdio>
#include<algorithm>
#include<vector>
#include<iostream>
#define R register
using namespace std;
const int gz=200001;
inline void in(R int &x)
{
int f=1;x=0;char s=getchar();
while(!isdigit(s)){if(s=='-')f=-1;s=getchar();}
while(isdigit(s)){x=x*10+s-'0';s=getchar();}
x*=f;
}
vector<int>v[gz];
int col[gz],f[gz],n,m,k,ans,vis[gz];
int find(R int x){return f[x]==x?x:f[x]=find(f[x]);}
signed main()
{
in(n),in(m),in(k);
for(R int i=1;i<=n;i++)in(col[i]),f[i]=i;
for(R int i=1,x,y;i<=m;i++)
{
in(x),in(y);
R int fa=find(x),fb=find(y);
if(fa==fb)continue;
f[fa]=fb;
}
for(R int i=1;i<=n;i++)
{
R int fa=find(i);
v[fa].push_back(col[i]);
}
for(R int i=1;i<=n;i++)
{
R int tmp=v[i].size();
R int mx=0;
if(tmp>1)
{
for(R int j=0;j<tmp;j++)
{
vis[v[i][j]]++;
mx=max(mx,vis[v[i][j]]);
}
for(R int j=0;j<tmp;j++)
vis[v[i][j]]--;
ans+=tmp-mx;
}
}
printf("%d",ans);
}
最新文章
- Excel中添加下拉框
- Java--常用类summary
- java collections
- 第二百四十天 how can I 坚持
- Hibernate—第一个案例
- hibernate 使用in方式删除数据
- POJ 1308 Is It A Tree?--题解报告
- Typora极简教程
- Angularjs启动入口, splash画面,与加快启动的技巧
- 阿里八八β阶段Scrum(3/5)
- e832. 从JTabbedPane中移动卡片
- IOS沙盒机制
- <;数据结构系列1>;封装自己的数组——手写动态泛型数组(简化版ArrayList)
- powerdesigner 设置字段显示comment注释
- ceph修复osd为down的情况
- 重拾C#教程:变量
- A bug about RecipientEditTextView
- Oulipo(Hash入门第一题 Hash函数学习)
- poj3616 Milking Time
- ASCII流程图
热门文章
- JUnit4.11 理论机制 @Theory 完整解读
- Linux产生背景
- POJ2112:Optimal Milking(Floyd+二分图多重匹配+二分)
- ERROR: Found lingering reference file hdfs
- rman备份与异机恢复
- DOM操作的一个小坑
- openstack中region、az、host aggregate、cell 概念
- 【POJ 1719】 Shooting Contest (二分图匹配)
- 端到端测试,protractor测试的教程
- bzoj 2120 线段树套平衡树