贪心+并查集即可.选取集合众数,然后答案就是集合大小-集合众数了.
#include <bits/stdc++.h> using namespace std; const int N=2e5+5; int a[N]; int fa[N]; vector<int>v[N]; int f(int x) { if(x==fa[x]) return fa[x]=x; else return fa[x]=f(fa[x]); } int main() { int n,m,k; scanf("%d%d%d",&n,&m,&k); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=n;i++) fa[i]=i; for(int i=1;i<=m;i++) { int x,y; scanf("%d%d",&x,&y); if(f(x)!=f(y)) fa[f(x)]=f(y); } for(int i=1;i<=n;i++) { v[f(i)].push_back(i); } map<int,int>p; int ans=0; for(int i=1;i<=n;i++) { if(v[i].size()>1) { int cnt=0; for(int j=0;j<v[i].size();j++) { p[a[v[i][j]]]++; cnt=max(cnt,p[a[v[i][j]]]); } p.clear(); ans+=v[i].size()-cnt; } } printf("%d\n",ans); return 0; } /* 3 3 3 1 2 3 1 2 2 3 3 1 */