POJ-2236-Wireless Network 和 HDU-1213-How Many Tables

POJ-2236:
题意:n是共有几台电脑,d代表每台电脑的最大通讯距离。接下来n行是每台电脑的坐标。
O i 代表要维修i点的电脑
S x y 询问x点,y点两台电脑是否可以通讯,是输出“SUCCESS”,否输入”FAIL”
解题思路:总的来说不是太难,就是一定要有标记数组,并查集的写法也都说按照模版写的,并没有什么太大变化。

#include 
#include 
#include 
#include 
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 
#include 
#include 
#include 
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;
}

你可能感兴趣的:(并查集)