【codeforces 731C 】【并查集+贪心 或者dfs搞连通分支 】【有n只袜子,k种颜色,在m天中,左右脚分别穿下标为l,r的袜子,问最少修改几只袜子颜色,可以使每天穿的袜子左右两只都同色】
来源:互联网 发布:js执行点击事件 编辑:程序博客网 时间:2024/06/02 21:43
传送门:http://codeforces.com/contest/731/problem/C
描述:
题意:
有n只袜子(1~n),k种颜色(1~k),在m天中,左脚穿下标为l,右脚穿下标为r的袜子,问最少修改几只袜子的颜色,可以使每天穿的袜子左右两只都同颜色。
思路一:
并查集处理出哪几堆袜子是同一颜色的,对于每堆袜子求出出现最多颜色的次数,用这堆袜子的数目减去该值即为这堆袜子需要修改的颜色数,最后对每堆求和
代码一:
#include <bits/stdc++.h>using namespace std;#define rep(i,k,n) for(int i=k;i<=n;i++)const int N=2e5+10;int p[N], col[N], num[N];int tol, ans;std::vector<int> v[N];int Find(int x){ return p[x] == x ? x : p[x] = Find(p[x]);}void unite(int x, int y){ x = Find(x); y = Find(y); if(x != y) p[y] = x;}int main(){ int n, m, k; cin >> n >> m >> k; rep(i, 1, n){ cin >> col[i]; } rep(i, 1, n)p[i] = i; int l, r; rep(i, 1, m){ cin >> l >> r; unite(l, r);//把颜色需要相同先放到一个集合中 } rep(i, 1, n){ if(p[i] == i)num[i] = ++tol; // 给集合编号 } rep(i, 1, n){ v[num[Find(i)]].push_back(col[i]); //每个集合中加入颜色 } rep(i, 1, tol){ int sz = v[i].size(); int mx = 0; std::map<int, int> mp; rep(j, 0, sz - 1){ mp[v[i][j]] ++; mx = max(mx, mp[v[i][j]]);//找到集合中颜色最多的 把剩下的元素变成该颜色即可 } ans += (sz - mx); } cout << ans << endl; return 0;}
思路二:
每堆需要同色的袜子就是一个连通分支, 先建图,在每个连通分支中,把所有袜子的颜色都改成出现颜色次数最多的那个颜色,即该分支节点个数 - 最多出现次数
代码二:
#include <bits/stdc++.h>using namespace std;#define rep(i,k,n) for(int i=k;i<=n;i++)const int N=3e5+10;std::vector<int> g[N];int col[N], vis[N], cur, mx, ans;std::map<int, int> num;void dfs(int x){ if(vis[x])return ; cur ++; mx = max(mx, ++num[col[x]]); vis[x] = 1; for(auto y : g[x]){ dfs(y); }}int main(){ int n, m, k; cin >> n >> m >> k; rep(i, 1, n){ cin >> col[i]; } int l, r; rep(i, 1, m){ cin >> l >> r; g[l].push_back(r); g[r].push_back(l); } rep(i, 1, n){ if(! vis[i]){ cur = 0; mx = 0; dfs(i); ans += (cur - mx); num.clear(); //不要忘了 } } cout << ans << endl; return 0;}
0 0
- 【codeforces 731C 】【并查集+贪心 或者dfs搞连通分支 】【有n只袜子,k种颜色,在m天中,左右脚分别穿下标为l,r的袜子,问最少修改几只袜子颜色,可以使每天穿的袜子左右两只都同色】
- Facebook创始人:不穿袜子的亿万富翁
- 穿袜子问题
- [转]瑞士研制出能当鞋穿的袜子
- 一只袜子折射出来的处事习惯和心态
- 小Z的袜子
- 小z的袜子
- 小z的袜子
- 【Codeforces Round 262 (Div 2)A】【水题】Vasya and Socks 妈妈买袜子 最多穿几天
- 儿子洗的袜子,虽白犹黑着
- 袜子上的Hello kitty
- ACM之遗失的袜子
- [BZOJ2038]小Z的袜子
- 小Z的袜子(hose)
- bzoj2038小z的袜子
- 小Z的袜子--莫队
- 有一堆袜子,如何用最快速高效的算法来给袜子配对?
- 有一堆袜子,如何用最快速高效的算法来给袜子配对?
- 自定义弹框样式,自定义confirm按钮,
- JavaScript WebSockets with UDP?
- JAVA之杂记
- 136. Single Number
- Error:Execution failed for task ':app:mergeDebugResources'.
- 【codeforces 731C 】【并查集+贪心 或者dfs搞连通分支 】【有n只袜子,k种颜色,在m天中,左右脚分别穿下标为l,r的袜子,问最少修改几只袜子颜色,可以使每天穿的袜子左右两只都同色】
- K-means聚类及其验证
- android studio 创建生成keystore SHA1值的申请 高德地图key值申请 android studio 打包生成apk
- C语言知识点-2
- python3基础(1)
- Android--通知之Notification
- 整理收藏一份PHP高级工程师的笔试题(附答案)
- Codeforces Alpha Round #20 C. Dijkstra?(优先队列优化)
- 神经网络三:浅析神经网络backpropagation算法中的代价函数