题目链接:codeforces723 D. Lakes in Berland

参考博客:http://www.cnblogs.com/Geek-xiyang/p/5930245.html

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<vector>
  4 #include<algorithm>
  5 #define CLR(a,b) memset((a),(b),sizeof((a)))
  6 using namespace std;
  7 const int N = 52;
  8 const int M = 2800;
  9 int n, m, k;
 10 char ch[N][N];
 11 int val[N][N];
 12 int fa[M], num[M];
 13 bool vis[M];
 14 int dx[] = {0,0,1,-1};
 15 int dy[] = {1,-1,0,0};
 16 void init(){
 17     CLR(ch,'.');
 18     int cnt = 0;
 19     for(int i = 0; i <= n+1; ++i)
 20         for(int j = 0; j <= m+1; ++j)
 21             val[i][j] = ++cnt;
 22     for(int i = 1; i <= cnt; ++i){
 23         fa[i] = i;
 24         num[i] = 1;
 25     }
 26 }
 27 int fin(int x){
 28     if(x != fa[x])
 29         fa[x] = fin(fa[x]);
 30     return fa[x];
 31 }
 32 void uni(int x, int y){
 33     if((x = fin(x)) == (y = fin(y))) return;
 34     else {
 35         fa[x] = y;
 36         num[y] += num[x];
 37     }
 38 }
 39 void make(int i, int j){
 40     for(int k = 0; k < 4; ++k){
 41         if(ch[dx[k]+i][dy[k]+j] == '.')
 42             uni(val[i][j], val[dx[k]+i][dy[k]+j]);
 43     }
 44 }
 45 bool cmp(int x, int y){
 46     return num[x] < num[y];
 47 }
 48 vector<int>v;
 49 int main(){
 50     int i, j, kk, rt, t;
 51     scanf("%d%d%d", &n, &m, &k);
 52     init();
 53     for(i = 0; i <= n+1; ++i){
 54         uni(val[0][0], val[i][0]);
 55         uni(val[0][0], val[i][m+1]);
 56     }
 57     for(i = 0; i <= m+1; ++i){
 58         uni(val[0][0], val[0][i]);
 59         uni(val[0][0], val[n+1][i]);
 60     }
 61     for(i = 1; i <= n; ++i){
 62         scanf("%s", ch[i]+1);
 63         ch[i][m+1] = '.';//第二遍改时把这句漏了继续WA
 64     }
 65     for(i = 1; i <= n; ++i)
 66         for(j = 1 ; j <= m; ++j)
 67             if(ch[i][j] == '.')
 68                 make(i, j);
 69     for(i = 1; i <= n; ++i){
 70         for(j = 1; j <= m; ++j){
 71             rt = fin(val[i][j]);
 72             if(ch[i][j] == '.' && fin(val[0][0]) != rt){
 73                 if(vis[rt]) continue;
 74                 else  vis[rt] = true;
 75                 v.push_back(rt);
 76             }
 77         }
 78     }
 79     sort(v.begin(), v.end(), cmp);
 80     int len = v.size();
 81     t = len;
 82     int ans = 0;
 83     if(t > k){
 84         for(i = 0; i < len; ++i){
 85             rt = fin(v[i]);
 86             if(vis[rt]){
 87                 vis[rt] = false;
 88                 t--;
 89                 for(j = 1; j <= n; ++j)
 90                     for(kk = 1; kk <= m; ++kk)//我第一遍把这里写成k导致WA死
 91                         if(fin(val[j][kk]) == rt) {ch[j][kk] = '*'; ans++;}
 92             }
 93             if(t == k) break;
 94         }
 95     }
 96     printf("%d\n", ans);
 97     for(i = 1; i <= n; ++i){
 98         for(j = 1; j <= m; ++j)
 99             printf("%c", ch[i][j]);
100         puts("");
101     }
102     return 0;
103 }

View Code

转载于:https://www.cnblogs.com/GraceSkyer/p/5933738.html

codeforces723 D. Lakes in Berland(并查集)相关推荐

  1. Codeforces Round #375 (Div. 2) D. Lakes in Berland 并查集

    http://codeforces.com/contest/723/problem/D 这题是只能把小河填了,题目那里有写,其实如果读懂题这题是挺简单的,预处理出每一块的大小,排好序,从小到大填就行了 ...

  2. 【CodeForces - 357C 】Knight Tournament(并查集 或 STLset)

    题干: Hooray! Berl II, the king of Berland is making a knight tournament. The king has already sent th ...

  3. 2022.1.18(一测补题,树的遍历题目,并查集)

    由于深夜点了外卖要1:50才到 闲着没事就补一下题目! 题目如下: 题目描述 In one one-dimensional world there are nn platforms. Platform ...

  4. 并查集c++代码_[Leetcode 每日精选](本周主题-并查集) 547. 朋友圈

    题目难度: 中等 原题链接 今天继续来做并查集的问题, 这道题仍然比较基础, 而且也是个比较接近现实的问题了. 大家在我的公众号"每日精选算法题"中的聊天框中回复 并查集 就能看到 ...

  5. HDU1811 Rank of Tetris 拓扑排序+并查集 OR 差分约束最短路+并查集

    题目链接 题意:就是给你一堆关系,看能不能排出个确定的顺序 做法: 1. 拓扑排序+并查集 应该很容易想到的一种思路,大于小于建立单向边.对于相等的呢,就把他们缩成一个点.就用并查集缩成一个点就行了 ...

  6. HDU 2586 How far away ? LCA ---tanjar+并查集 离线算法

    tanjar算法离线求LCA的思想主要是利用并查集的思想. 求距离的话就是d[start[i]]+end[en[i]]-2*d[lca[i]]; 首先从根节点dfs,在深度遍历的回溯的过程中不断的更新 ...

  7. POJ - 2513 Colored Sticks 欧拉通路+并查集+静态树

    一开始想用map来搞,但是感觉好复杂,然后想了一下看大佬们用trie做的,感觉十分合理就敲了一发. 一开始re,数组要开到550000 只会静态的字典树,在每个根节点看是否出现过改颜色,如果没有就把该 ...

  8. 关于 并查集(union find) 算法基本原理 以及 其 在分布式图场景的应用

    二月的最后一篇水文-想写一些有意思的东西. 文章目录 环检测在图数据结构中的应用 深度/广度优先 检测环 并查集数据结构 (Union-Find) 基本概念 初始化 合并 union 查找祖先 优化1 ...

  9. 【BZOJ1015】【JSOI2008】星球大战 并查集

    题目大意 给你一张\(n\)个点\(m\)条边的无向图,有\(q\)次操作,每次删掉一个点以及和这个点相邻的边,求最开始和每次删完点后的连通块个数. \(q\leq n\leq 400000,m\le ...

最新文章

  1. 温度对结构光深度的影响
  2. Spartan-II 应用指南 转载
  3. OC如何跳到系统设置里的各种设置界面
  4. 海龟绘图小动物_震惊!被塑料绳勒成两半的海龟
  5. SSH ALL-IN-ONE
  6. asp.net checkboxlist绑定数据读取出来
  7. c语言else不运行,if...else if..else第三句不执行?
  8. Java反射库jOOR简介
  9. 两个三维图像互信息python_两的解释|两的意思|汉典“两”字的基本解释
  10. Unity游戏接入Steam成就
  11. php万年历月份处理_使用 PHP 写的万年历接口
  12. PNG图片背景透明-简单方法
  13. webServer_国内手机号码归属地查询
  14. 过零检测电路原理与作用 可控整流
  15. php极光短信验证码,极光短信验证码验证问题
  16. python爬网易云音乐评论最多的歌_使用Python爬一爬网易云音乐上那些评论火爆的歌曲...
  17. JSONObject遍历并替换部分json值
  18. 【Vue3+vite+Element-UI Plus 】
  19. [Extjs6]清除数组内容
  20. C++ 扫雷小游戏(380行代码)

热门文章

  1. 央行数字货币突然“赛马”试点!但其走过的“长征路”却鲜为人知
  2. python 爬取直播弹幕视频_调用斗鱼API爬取直播间弹幕信息(用户昵称及弹幕内容)...
  3. java猎头怎么做好_JAVA(猎头职位)
  4. opencv从入门到精通11
  5. mysql是如何使用方法_如何使用MySQL数据库,MySQL的使用方法?
  6. 横河电机战略入股芬兰公司Sensire Ltd.以寻求在冷链监控领域的合作
  7. 如何做好H5性能优化?
  8. 《Focusing Attention:Towards Accurate Text Recognition in Natural Images》阅读
  9. office插件开发_[插件开发]用VB6开发一个插件同时给32位和64位Office使用
  10. 干货|10个C4D必备插件,让工作事半功倍