您的位置:首页 > 其它

(codeforces)C. Socks

2017-04-16 11:25 155 查看
どこでもドア:http://codeforces.com/problemset/problem/731/C

并查集。。贪心。。

code:

const int MAX=2*1e5+5;

int color[MAX],uni[MAX],sum[MAX],n,m,k,a,b;
int get_boss(int x){
return x==uni[x] ? x : uni[x]=get_boss(uni[x]);
}
void union_(int x,int y)
{
int t1=get_boss(x);
int t2=get_boss(y);
if(t1!=t2)
{
uni[t1]=t2;
sum[t2]+=sum[t1];
}
}
struct same_color{
map<int, int> ma;
}s[MAX];
int main()
{
cin>>n>>m>>k;
//将连通的袜子记为一“块”,并记录这一“块”的个数
for(int i=1;i<=n;i++){
cin>>color[i];
uni[i]=i;
sum[i]=1;
}
for(int i=0;i<m;i++){
cin>>a>>b;
union_(a,b);
}
//记录一共有多少“块”
set<int> all_boss;
for(int i=1;i<=n;i++){
int boss=get_boss(i);
all_boss.insert(boss);
s[boss].ma[color[i]]++;
}
//对于每一“块”袜子的颜色进行判断,找出相同颜色最多的哪一种袜子。
//那么要变颜色的袜子的个数即为这一块袜子总数-颜色最多的个数
int ans=0;
set<int>::iterator it=all_boss.begin();
for(;it!=all_boss.end();it++){
map<int,int>::iterator itt=s[*it].ma.begin();
int cnt=0;
for(;itt!=s[*it].ma.end();itt++){
if(itt->second>cnt)
cnt=itt->second;
}
ans+=(sum[*it]-cnt);
}

cout<<ans<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  codeforces