例题3.5 易爆物 UVa1160

来源:互联网 发布:java输入字符串语句 编辑:程序博客网 时间:2024/05/02 02:56

1.题目描述:点击打开链接

2.解题思路:本题利用并查集解决。我们把每个元素看做一个顶点,则一个简单化合物就是一条边。当整个图存在环的时候,组成环的边对应的化合物是危险的,反之则是安全的。这样,可以通过并查集来维护图的连通分量集合,每次得到一个简单化合物,检查x和y是否在同一个集合中,如果是,则拒绝,反之则接受。

3.代码:

#define _CRT_SECURE_NO_WARNINGS #include<iostream>#include<algorithm>#include<string>#include<sstream>#include<set>#include<vector>#include<stack>#include<map>#include<queue>#include<deque>#include<cstdlib>#include<cstdio>#include<cstring>#include<cmath>#include<ctime>#include<functional>using namespace std;#define N 100000+10int pa[N];int findset(int x){return pa[x] != x ? pa[x] = findset(pa[x]) : x;}int main(){freopen("t.txt", "r", stdin);int x, y;while (~scanf("%d", &x)){for (int i = 0; i < N; i++)//初始化并查集pa[i] = i;int refusals = 0;while (x != -1){scanf("%d", &y);x = findset(x); y = findset(y);if (x == y)++refusals;//属于同一个集合,拒绝else pa[x] = y;//合并scanf("%d", &x);}printf("%d\n", refusals);}return 0;}

0 0
原创粉丝点击