天天看點

HDU 1272 小希的迷宮(帶環并查集)

很水的一道題,但是我學到了一個東西。

好像全局變量也不能在函數中直接改~

是以初始化的時候wa了好多發,就是因為flag初始化沒成功!!

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;

const int maxn = 100005;
int father[maxn],vis[maxn],cnt,flag;

void init(int *flag) { //這裡可以用指針來改變變量的值
    *flag = 1;
    for(int i = 0;i < maxn;i++)
        father[i] = i;
    memset(vis,0,sizeof(vis));
}

int query(int x) {
    if(x != father[x]) 
        father[x] = query(father[x]);
    return father[x];
}

int main() {
    for(int i = 0;i <= maxn;i++)
        father[i] = i;
    int x,y,flag = 1;
    memset(vis,0,sizeof(vis));
    init(&flag);
    while(scanf("%d%d",&x,&y) != EOF && (x != -1 || y != -1))  {
        if(!x && !y) {
            if(flag) {
                int ans,i;
                for(i = 1;i < maxn;i++)
                    if(query(i) != i) {
                        ans = query(i);
                        break;
                    }
                for(int j = i;j < maxn;j++)
                    if(query(j) != j && query(j) != ans)
                        flag = 0;
            }
            if(flag)
                printf("Yes\n");
            else 
                printf("No\n");
            init(&flag); //輸入變量位址
            continue;
        }
        int a = query(x);
        int b = query(y);
        if(vis[y])
            flag = 0;
        if(flag) {
            if(a == b) //當query(father[x]) == query(x)的時候就說明存在環!
                flag = 0;
            else {
                father[b] = a;
            }
        }
        vis[y] = 1;
    }
    return 0;
}