POJ-2236-Wireless Network 和 HDU-1213-How Many Tables
来源:互联网 发布:bi 数据统计是什么 编辑:程序博客网 时间:2024/06/05 13:53
POJ-2236:
题意:n是共有几台电脑,d代表每台电脑的最大通讯距离。接下来n行是每台电脑的坐标。
O i 代表要维修i点的电脑
S x y 询问x点,y点两台电脑是否可以通讯,是输出“SUCCESS”,否输入”FAIL”
解题思路:总的来说不是太难,就是一定要有标记数组,并查集的写法也都说按照模版写的,并没有什么太大变化。
#include <cstdio>#include <iostream>#include <cstring>#include <algorithm>using namespace std;const int MAXN = 1005;struct Dot { int xd, yd;}dot[MAXN];int par[MAXN], ran[MAXN];bool isUsed[MAXN]; //标记这个点的电脑是否修好了void init (int n){ for (int i = 1; i <= n; i++) { par[i] = i; ran[i] = 1; isUsed[i] = false; //初始都是未修的 }}int find(int x){ if (par[x] == x) { return x; } else { return par[x] = find(par[x]); }}void unite(int x, int y){ x = find(x); y = find(y); if (x == y) { return; } if (ran[x] < ran[y]) { par[x] = y; } else { par[y] = x; if (ran[x] == ran[y]) { ran[x]++; } }}bool same(int x, int y){ return find(x) == find(y);}int main(){ int computer, d; cin >> computer >> d; init(computer); for (int i = 1; i <= computer; i++) { cin >> dot[i].xd >> dot[i].yd; } char order[2]; while (~scanf("%s", order)) { if (order[0] == 'O') { int disX, disY, index; cin >> index; isUsed[index] = true; for (int i = 1; i <= computer; i++) { if (i != index && isUsed[i]) { //如果电脑是修好的,才能进行通讯,也就是才能加入并查集 disX = dot[i].xd - dot[index].xd; disY = dot[i].yd - dot[index].yd; if (disX*disX + disY*disY <= d*d) { unite(index, i); } } } } else { int x, y; cin >> x >> y; if (same(x, y)) { cout << "SUCCESS" << endl; } else { cout << "FAIL" << endl; } } } return 0;}
HDU-1213
题意:自己读,比较好懂
解题思路:也是并查集问题,并查集的写法没啥特别的根据模版写就行了。最重要的一点就是判断需要几个桌子的时候可以判断par[i] == i
是的话 桌子+1;
#include <cstdio>#include <algorithm>#include <iostream>#include <cstring>using namespace std;const int MAXN = 1005;int par[MAXN];int ran[MAXN];void init(int n){ for (int i = 1; i <= n; i++) { par[i] = i; ran[i] = 1; }}int find(int x){ if (par[x] == x) { return x; } else { return par[x] = find(par[x]); }}void unite(int x, int y){ x = find(x); y = find(y); if (x == y) { return; } else if (ran[x] < ran[y]) { par[x] = y; } else { par[y] = x; if (ran[x] == ran[y]) { ran[x]++; } }}int main(){ int t, friends, m; cin >> t; while (t--) { cin >> friends >> m; init(friends); int a, b; for (int i = 0; i < m; i++) { cin >> a >> b; unite(a, b); } int ans = 0; for (int i = 1; i <= friends; i++) { if (par[i] == i) { //因为每个桌子有且仅有一个par[i]==i ans++; } } cout << ans << endl;// for (int i = 1; i <= friends; i++) {// cout << "i: " << i << " " << par[i] << endl;// } } return 0;}
阅读全文
0 0
- POJ-2236-Wireless Network 和 HDU-1213-How Many Tables
- hdu 1213 how many tables
- hdu 1213 How Many Tables
- hdu 1213 How Many Tables
- HDU 1213 How Many Tables
- hdu 1213 How Many Tables
- HDU 1213 How Many Tables
- hdu 1213 How Many Tables
- Hdu 1213 How Many Tables
- hdu 1213 How Many Tables
- hdu 1213 How Many Tables
- HDU 1213 how many tables
- hdu 1213 How Many Tables
- hdu 1213how many tables
- hdu 1213 How Many Tables
- Hdu 1213 - How Many Tables
- HDU 1213 How Many Tables
- HDU 1213 How Many Tables
- TCP中的NO_DELAY
- 我与《深入浅出嵌入式底层软件开发》
- 插入排序
- Android Framework学习笔记 -- Binder原理
- 如何用c#读取word中的某一段文字
- POJ-2236-Wireless Network 和 HDU-1213-How Many Tables
- 线上系统性问题定位与方法论
- python正则表达式和re模块
- Linux命令(4)-top & htop
- git应用补丁
- envi分类后修改类名称、显示颜色
- 系统测试的策略
- JavaWeb面试(六)
- JAVA数组的拷贝