#include<bits/stdc++.h>
using namespace std;
const int N=200000;
int color[N+100];
int f[N+100];
int knum[N+100],book[N+100];
void init(int n)
{
for(int i=1;i<=n;i++) f[i]=i;
}
int found(int x)
{
if(x==f[x]) return x;
int p=x;
while(p!=f[p])
{
f[x]=f[f[x]];
p=f[x];
}
return p;
}
void Union(int x,int y)
{
int tx=found(x),ty=found(y);
if(tx!=ty) f[tx]=ty;
}
vector<int>point[N+100];
int main()
{
int n,m,k;
scanf("%d%d%d",&n,&m,&k);
init(n);
for(int i=1;i<=n;i++) scanf("%d",&color[i]);
for(int i=0;i<m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
Union(x,y);
}
//for(int i=1;i<=n;i++) printf("%d ",f[i]);cout<<endl;//优化found后的数组结果
int ans=0;
/*
for(int i=1;i<=n;i++)
{
if(!book[i])
{
memset(knum,0,sizeof(knum));
int father=found(i),maxn=-1,sum=0;
for(int j=i;j<=n;j++)
{
if(!book[j]&&found(j)==father)
{
book[j]=1;
sum++;
int temp=++knum[color[j]];
if(temp>maxn){maxn=temp;}
}
}
ans+=sum-maxn;
}
}
*/
int num[N+100];//stl_vector,map的优化。
int cn=0;
for(int i=1;i<=n;i++)
{
int to=found(i);
point[to].push_back(i);
if(to==i) {num[cn++]=i;}
}
for(int i=0;i<cn;i++)
{
int mx=0,siz=point[num[i]].size();
map<int,int>p;
for(int j=0;j<siz;j++)
{
mx=max(mx,++p[color[point[num[i]][j]]]);
}
ans+=siz-mx;
}
printf("%d\n",ans);
return 0;
}
Socks
stl优化-3
最新推荐文章于 2024-05-11 02:42:01 发布