POJ 2492 A Bug's Life

来源:互联网 发布:java 当前时间加1小时 编辑:程序博客网 时间:2024/05/22 09:49

题目:点击打开链接


题目大意:

有很多虫子,给出交配的关系,问是否存在同性恋的情况。


思路:

用并查集存储虫子之间的关系,f代表与每个虫子相关的那个虫子,k表示性别。每一次输入新的关系时,如果这两个虫子本就在一棵树上且它们的性别相同,就说明有同性恋的情况;否则,就合并这两棵树。

第一次提交时RE,原因是合并时性别的关系处理不当。比如a、b虫子在自己的树上均为雄性,但是因为这是两颗不同的树,树与树之间并无关联,所以是可以合并的。合并的时候要将所有的性别规则都改得一致,就是将两个树中的其中一颗的性别全部颠倒。因为find函数无法遍历这棵树上的所有节点,所以这一功能不能在find函数中实现,要单独写。

第二次提交时格式错误,又忘了每组数据后的那个空行了。


代码:

#include <cstdio>#include <iostream>#include <string.h>using namespace std;int f[2002]= {0};bool k[2002]= {0};int find(int x){if(f[x]==x){return x;}int y=find(f[x]);f[x]=y;return f[x];}int main() {int t;scanf("%d",&t);int xx=0;while(t--) {xx++;printf("Scenario #%d:\n",xx);int n,m;scanf("%d%d",&n,&m);memset(f,0,sizeof(f));bool flag=false;for(int i=1;i<=n;i++){f[i]=i;}for(int i=1; i<=m; i++) {int x,y;scanf("%d%d",&x,&y);if(flag==false) {int rootx=find(x),rooty=find(y);if(rootx==rooty&&k[x]==k[y]) {flag=true;} else {if(k[x]!=k[y]){for(int i=1;i<=n;i++){if(f[i]==rootx){f[i]=rooty;}}}else{for(int i=1;i<=n;i++){if(f[i]==rootx){k[i]=(k[i]==false);f[i]=rooty;}}}}}}if(flag==true){printf("Suspicious bugs found!\n\n");}else{printf("No suspicious bugs found!\n\n");}}return 0;}



1 0
原创粉丝点击