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;}
原创粉丝点击