并查集带偏移向量 HDU1829

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 #include <algorithm>
 5 #include <queue>
 6
 7 using namespace std;
 8
 9 int father[2010];
10 int offset[2010];
11 int flag;
12
13 void init(int n)
14 {
15     for(int i=1;i<=n;i++)
16     {
17         father[i]=i;
18         offset[i]=0;
19     }
20     flag=1;
21 }
22
23 int root(int x)
24 {
25     if(x!=father[x])
26     {
27         int tmp=father[x];
28         father[x]=root(father[x]);
29         offset[x]=(offset[x]+offset[tmp])%2;
30     }
31     return father[x];
32 }
33
34 void merge(int x,int y)
35 {
36     int fx=root(x);
37     int fy=root(y);
38     if(fx!=fy)
39     {
40         father[fx]=fy;
41         offset[fx]=(offset[y]+1-offset[x])%2;
42     }
43     root(x);
44 }
45
46 int main()
47 {
48     int T;
49     cin>>T;
50     for(int s=1;s<=T;s++)
51     {
52         int n,m;
53         scanf("%d%d",&n,&m);
54         init(n);
55         int x,y;
56         for(int i=0;i<m;i++)
57         {
58             scanf("%d%d",&x,&y);
59             if(flag)
60             {
61                 merge(x,y);
62                 if(offset[x]==offset[y])
63                     flag=0;
64             }
65         }
66         cout<<"Scenario #"<<s<<":"<<endl;
67         if(flag)
68             cout<<"No suspicious bugs found!"<<endl;
69         else
70             cout<<"Suspicious bugs found!"<<endl;
71         cout<<endl;
72     }
73     return 0;
74 }

时间: 2024-11-05 18:35:08

并查集带偏移向量 HDU1829的相关文章

UVA - 12232 Exclusive-OR (并查集扩展偏离向量)

Description You are not given n non-negative integersX0,X1,..., Xn-1 less than220, but they do exist, and their values never change. I'll gradually provide you some facts about them, and ask you some questions. There are two kinds of facts, plus one

POJ 1182 食物链 [并查集 带权并查集 开拓思路]

传送门 P - 食物链 Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 1182 Appoint description:  System Crawler  (2015-01-27) Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物

【并查集&amp;&amp;带权并查集】BZOJ3296&amp;&amp;POJ1182

bzoj1529[POI2005]ska Piggy banks [题目大意] n头奶牛m种语言,每种奶牛分别掌握一些语言.问至少再让奶牛多学多少种语言,才能使得它们能够直接或间接交流? [思路] (n+m)个点,奶牛学会某种语言就合并它和语言的节点.并查集维护联通块,答案为联通块个数-1.水,可是我跳坑了. 我一开始做法是设总的联通块有(n+m)个,然后没合并一次减去1.其实这样是不可行的,因为我们只需要考虑奶牛(即节点1..n)有几个联通块.有可能一些语言根本没有任何奶牛掌握-- 1 #in

UVA11987 - Almost Union-Find (并查集带删除)

题目链接 题目大意:给出三个操作: 1 p q 表示将p q 这两个数所在的集合合并在一起.2 p q表示将p这个数从原有的集合中拿出来放到q所在的集合中.3 p表示查询p所在的集合总共有几个元素,和是多少. 解题思路:并查集.只是并查集中并没有删除的操作.所以就需要将删除的这个点的影响降到0,也就是给删除的点申请一个新的id,以后都是用这个新的id来表示这个点,这样原来的那个集合里的点p就没意义,自然影响就为0. 代码: #include <cstdio> #include <cstr

POJ 1182 (经典食物链 /并查集扩展)

(參考他人资料) 向量偏移--由"食物链"引发的总结 http://poj.org/problem?id=1182这道食物链题目是并查集的变型.非常久曾经做的一次是水过的,这次细致地研究了这"食物链",无非就是运用向量偏移.从曾经节点与节点转化成向量与向量的关系.我们能够把矛盾的产生得益于向量偏移时的结果. 直接引出向量偏移的运用. 以下是POJ一位大牛这样理解的,本人稍有改动. 对于集合里的随意两个元素a,b而言,它们之间必然存在着某种联系,由于并查集中的元素

codeforces 687D Dividing Kingdom II 带权并查集(dsu)

题意:给你m条边,每条边有一个权值,每次询问只保留编号l到r的边,让你把这个图分成两部分 一个方案的耗费是当前符合条件的边的最大权值(符合条件的边指两段点都在一个部分),问你如何分,可以让耗费最小 分析:把当前l到r的边进行排序,从大到小,从大的开始不断加边,判断当前能否形成二分图,如果能形成二分图,继续加边 如果不能形成二分图,那当前边的权值就是最小耗费(是不是很眼熟) 思路很清晰,现在我们要解决的是如何判断可以形成二分图,有两种,一个是2染色当前图(肯定超时) 所以只剩一种方法,带权并查集

带权并查集&amp;&amp;并查集

并查集 一般的并查集主要记录节点之间的链接关系,而没有其他的具体的信息,仅仅代表某个节点与其父节点之间存在联系,它多用来判断图的连通性 主要操作有: 初始化 把每个点所在集合初始化为其自身.通常来说,这个步骤在每次使用该数据结构时只需要执行一次,无论何种实现方式,时间复杂度均为O(N). void init(int n) { for(int i=1;i<=n;i++) { q[i]=i; } } 查找 查找元素所在的集合,即根节点. int find(int x) { int h=x; if(h

poj_1182 并查集

题目大意 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B,B吃C,C吃A.现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种. 有人用两种说法对这N个动物所构成的食物链关系进行描述: 第一种说法是"1 X Y",表示X和Y是同类. 第二种说法是"2 X Y",表示X吃Y. 此人对N个动物,用上述两种说法,一句接一句地说出K句话,这K句话有的是真的,有的是假的.当一句话满足下列三条之一时,这句话就是假

并查集一般高级应用的理解

并查集高级应用一般是带权并查集,首先肯定要维护每个元素之间相应的关系,一个简单的数组要实现这个功能,则要将数组开大,将数组分为多个段,使每一段数组 代表不同的含义,而对于段与段之间的联系,就实现了对并查集带权的处理,一般来说,并查集数组大小是  n*m(n:题目所给元素的范围,m:相互关系的数目), 相关题目比如    食物链,关押犯人