Wikioi 1002
来源:互联网 发布:linux强制杀死进程 编辑:程序博客网 时间:2024/04/28 05:21
#include<iostream>#include<cstdio>#include<cstring>#include<cstdlib>#include<cmath>#include<queue>#include<stack>using namespace std;#define maxn 2600#define INF 0xffffffint father[maxn];struct Map{ int x, y;}map[maxn];struct node{ int a, b, len; friend bool operator < (node x, node y) { return x.len > y.len; }};int find(int x);int Union(int x, int y);int Distance(Map a, Map b);void kruskal(int n);int main(){ int m, n; while(cin >> m >> n) { int i, j, k=0; char ch; for(i=1; i<=m; i++) for(j=1; j<=n; j++) { cin >> ch; if(ch == '#') { map[++k].x = i; map[k].y = j; } } for(i=1; i<=k; i++) father[i] = i; kruskal(k); } return 0;}int find(int x){ if(father[x] != x) return father[x] = find(father[x]); return x;}int Union(int x, int y){ x = find(x), y = find(y); if(x != y) { father[x] = y; return 1; } return 0;}int Distance(Map a, Map b){ int dx = abs(a.x - b.x), dy = abs(a.y - b.y); if(dx <= 1 && dy <= 1)return 0; if(dx <= 1)return dy-1; if(dy <= 1)return dx-1; return INF;}void kruskal(int n){ priority_queue<node> que; int i, j, k, sum=0, ans=0; node q; for(i=1; i<n; i++) for(j=i+1; j<=n; j++) { q.len = Distance(map[i], map[j]); if(q.len == 0) k = Union(i, j); else if(q.len != INF) { q.a = i, q.b = j; que.push(q); } } for(i=1; i<=n; i++) if(father[i] == i) ans++; k = 0; while(que.size()) { q = que.top(), que.pop(); if(Union(q.a, q.b)) { sum += q.len; k++; } } cout << ans <<endl; cout << k << " " << sum <<endl;}
0 0
- Wikioi 1002
- wikioi 1002 搭桥
- wikioi 1002 搭桥
- 【wikioi 1002】搭桥 dfs+kruskal
- wikioi-1742
- wikioi-1038
- wikioi-1204
- wikioi-1205
- wikioi 高精度
- wikioi 2344
- wikioi 选课
- wikioi 1217
- Wikioi 3037
- wikioi 传话
- Wikioi 1000
- Wikioi 1001
- Wikioi 1004
- Wikioi 1007
- [Python]剖析类的机理
- 多线程经典面试题
- 方式的方法没开始呢的空间色色
- 十款最新的JavaScript开发工具
- codefoce 416 B
- Wikioi 1002
- 按时发达是飞洒发生
- Wikioi 1004
- hdu 4857 逆拓扑+大根堆(priority_queue)
- 设计模式学习笔记之单件模式
- WindowsAPI详解——OpenProcess 打开|获得进程句柄 - [VC++编程]
- ORACLE遞歸查詢
- HDU_2025 查找最大元素
- 计算几何模板