博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hihocoder offer收割编程练习赛11 C 岛屿3
阅读量:4984 次
发布时间:2019-06-12

本文共 1708 字,大约阅读时间需要 5 分钟。

思路:

并查集的应用。

实现:

1 #include 
2 #include
3 using namespace std; 4 5 bool a[1005][1005]; 6 int n, x, y; 7 int par[1000005]; 8 int ran[1000005]; 9 int dx[4] = { 1, 0, -1, 0 };10 int dy[4] = { 0, 1, 0, -1 };11 12 void init(int n)13 {14 for (int i = 0; i < n; i++)15 {16 ran[i] = 0;17 par[i] = i;18 }19 }20 21 int find(int x)22 {23 if (par[x] == x)24 return x;25 return par[x] = find(par[x]);26 }27 28 29 void unite(int x, int y)30 {31 x = find(x);32 y = find(y);33 if (x == y)34 return;35 if (ran[x] < ran[y])36 par[x] = y;37 else38 {39 par[y] = x;40 if (ran[x] == ran[y])41 ran[x]++;42 }43 }44 45 bool same(int x, int y)46 {47 return find(x) == find(y);48 }49 50 int trans(int x, int y)51 {52 return x * 1000 + y;53 }54 55 int main()56 {57 init(1000005);58 cin >> n;59 int now = 0, c = 0;60 for (int i = 0; i < n; i++)61 {62 now++;63 c += 4;64 cin >> x >> y;65 a[x][y] = true;66 int tmp = trans(x, y);67 for (int j = 0; j < 4; j++)68 {69 int nx = x + dx[j];70 int ny = y + dy[j];71 if (nx >= 0 && nx < 1000 && ny >= 0 && ny < 1000 && a[nx][ny])72 {73 int t = trans(nx, ny);74 if (!same(tmp, t))75 {76 unite(tmp, t);77 now--;78 }79 c -= 2;80 }81 }82 cout << now << " " << i + 1 << " " << c << endl;83 }84 return 0;85 }

 

转载于:https://www.cnblogs.com/wangyiming/p/6626842.html

你可能感兴趣的文章
3. 无重复字符的最长子串
查看>>
week3xml
查看>>
MFC 多线程
查看>>
Codeforces Round #402 (Div. 2) 阵亡记
查看>>
Ceph源码解析:Scrub故障检测
查看>>
FastDFS 自动部署和配置脚本
查看>>
有道面试
查看>>
跟牛牛老师学习python自动化的第六天
查看>>
利用Flume将本地文件数据中收集到HDFS
查看>>
html5的优缺点
查看>>
wget下载文件
查看>>
Swagger使用--在一个Controller中使用相同(类似)参数的方法
查看>>
Vim 加 Gmail 变身 Vmail
查看>>
P1294 高手去散步
查看>>
IOS用IB快速适配iPhone5
查看>>
一次谷歌面试趣事
查看>>
(5) Orchard 开发之 Localization and NullLocalizer
查看>>
分类算法(1)--KNN
查看>>
每日记载内容总结3
查看>>
ajax等待请求
查看>>