很水的一道題,但是我學到了一個東西。
好像全局變量也不能在函數中直接改~
是以初始化的時候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;
}