您的位置:首页 > 其它

UVALive - 3644 X-Plosives (并查集)

2017-07-27 13:55 375 查看
思路:每一个product都可以作一条边,每次添加一条边,如果这边的加入使得某个集合构成环,就应该refuse,那么就用并查集来判断。

AC代码:

//#define LOCAL
#include <stdio.h>
#include <string.h>
const int maxn = 1e5 + 5;
int par[maxn], rank[maxn];

void init() {
memset(rank, 0, sizeof(rank));
for(int i = 0; i <= maxn; i++) {
par[i] = i;
}
}

int findRoot(int x) {
return x != par[x] ? par[x] = findRoot(par[x]) : x;
}

//启发式合并
void unionSet(int x, int y) {
if(rank[x] > rank[y]) {
par[y] = x;
} else {
par[x] = y;
if(rank[x] == rank[y]) rank[y]++;
}
}

int main() {
#ifdef LOCAL
freopen("data.in", "r", stdin);
freopen("data.out", "w", stdout);
#endif // LOCAL

int x, y, refuse = 0;
init();
while(scanf("%d", &x) == 1) {
if(x == -1) {
printf("%d\n", refuse);
init();
refuse = 0;
}else {
scanf("%d", &y);
x = findRoot(x);
y = findRoot(y);
if(x == y) {
//refuse it
refuse++;
} else {
//union
unionSet(x, y);
}
}
}
return 0;
}


如有不当之处欢迎指出!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: