HDU-1829 A Bug's Life。并查集构造,与POJ1709异曲同工!

    xiaoxiao2021-04-15  34

    A Bug's Life

                                                        Find them, Catch them

      都是并查集构造的题,不久前MQL学长给我们拉过POJ上那道题,稍微复杂点,过了这么久竟然差不多忘完了,比赛的时候由队友在做这道题,我一直在看其他的题,在确定其他的题都不好做而且这个题好几个队都过了所以我们打算攻一攻这个题,只是依稀记得要用一个数组存与其对立的点,那么我们将与其对立的点都用并查集连起来,直接找是否有冲突就可以了。还好在思路不是很混乱的时候做出了这道题,不过比赛还是被学弟虐菜了。。。。。

      题意:2种性别的病毒,为了验证异性相吸原则,做了个实验,然后给出两两配对的关系,求是否有冲突。

      思路:和POJ1709那道类似,用一个diff数组存与其对立的病毒,当然,初始化可以为-1或本身(自己不可能和自己对立),然后只需在输入的时候将未赋值的赋值,然后将与这个病毒对立的病毒当前对立的病毒并查集连接起来就行了,只要存在冲突,肯定是可以判断的。

    int find(int x) { return f[x]==x?x:f[x]=find(f[x]); } int main() { int t,n,m; scanf("%d",&t); int t1=1; while(t--) { scanf("%d%d",&n,&m); int u,v,ff=0; for(int i=1;i<=n;i++) p[i]=i,f[i]=i; for(int i=0;i<m;i++) { scanf("%d%d",&u,&v); if(p[u]==u) p[u]=v; if(p[v]==v) p[v]=u; int u1=find(u),v1=find(v); int u2=find(p[u]),v2=find(p[v]); if(u2==v2||u1==v1) ff=1; f[u2]=v1; f[v2]=u1; } printf("Scenario #%d:\n",t1++); if(ff) puts("Suspicious bugs found!"); else puts("No suspicious bugs found!"); puts("");//注意输出问题 } return 0; }

    转载请注明原文地址: https://ju.6miu.com/read-671389.html

    最新回复(0)