CF-731c

xiaoxiao2021-02-28  157

//并查集把颜色要相同的下标放在同一集合中,贪心:找到每个集合中出现最多的颜色 把该集合中剩下的颜色变为该颜色 #include <bits/stdc++.h> using namespace std; const int AX = 2e5+666; int a[AX], pre[AX]; vector<int>p[AX]; int gather[AX]; long long sum = 0; int find(int x) { if (x == pre[x]) return x; else return pre[x] = find(pre[x]); } void mix(int x,int y){ int xx = find(x); int yy = find(y); if(xx!=yy){ pre[yy] = xx; } } int main() { int n,m,k; cin>>n>>m>>k; for(int i = 1;i <= n;i++){ cin>>a[i]; pre[i] = i; } int x,y; for (int i=0;i<m;i++) { scanf("%d%d",&x,&y); mix(x,y); } int num = 0; for(int i=1;i<=n;i++){ if(pre[i]==i){ gather[i]= ++num; } } for(int i=1;i<=n;i++){ p[gather[find(i)]].push_back(a[i]); } for(int i=1;i<=num;i++){ int size1 = p[i].size(); int mx = 0; map<int,int>mp; for(int j=0;j<size1;j++){ mp[p[i][j]]++; mx = max(mx,mp[p[i][j]]); } sum += (size1-mx); } cout<<sum<<endl; return 0; }
转载请注明原文地址: https://www.6miu.com/read-38211.html

最新回复(0)