51nod 1307 绳子与重物(并查集水了一发)

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1307

题意:

思路:

可以直接二分答案,然后dfs。

因为标签是并查集,所以我考虑了一下并查集,利用并查集不断向上回溯加负重,居然过了,只能说数据有点水。

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<cstdio>
 5 #include<sstream>
 6 #include<vector>
 7 #include<stack>
 8 #include<queue>
 9 #include<cmath>
10 #include<map>
11 #include<set>
12 using namespace std;
13 typedef long long ll;
14 const int INF = 0x3f3f3f3f;
15 const int maxn=50000+5;
16 const int mod=1e9+7;
17
18 int n;
19 int p[maxn];
20 int c[maxn],w[maxn],f[maxn];
21
22 int main()
23 {
24     //freopen("in.txt","r",stdin);
25     while(~scanf("%d",&n))
26     {
27         for(int i=0;i<n;i++)  p[i]=i;
28         int ans=n;
29         for(int i=0;i<n;i++)
30         {
31             scanf("%d%d%d",&c[i],&w[i],&f[i]);
32             if(ans!=n)   continue;
33             if(f[i]==-1)  continue;
34             p[i]=f[i];
35             int x=i;
36             while(true)
37             {
38                 x=p[x];
39                 w[x]+=w[i];
40                 if(w[x]>c[x])  {ans=i;break;}
41                 if(x==p[x])  break;
42             }
43         }
44         printf("%d\n",ans);
45     }
46     return 0;
47 }
时间: 2024-10-22 10:03:52

51nod 1307 绳子与重物(并查集水了一发)的相关文章

G - Brain Network (easy)(并查集水题)

G - Brain Network (easy) Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u CodeForces 690C1 Description One particularly well-known fact about zombies is that they move and think terribly slowly. While we still don't know

POJ2236 wireless network 【并查集水题】

前端开发whqet,csdn,王海庆,whqet,前端开发专家 今天是个好日子,2014年5月20日,表白的最佳时机,虽说孩子已经四岁.结婚已经五年,但是也不可以偷懒,于是有了这个效果. 在线研究点这里,下载收藏点这里.程序猿and程序媛,大胆秀出你的爱吧. 利用html5 canvas实现动态的文字粒子效果,效果如下. OK,简单看看原理,首先我们需要在canvas里面实现描边文字,然后利用getImageData获得描边文字的像素矩阵,将粒子效果绑定在描边文章上. 整个效果如下. html文

并查集水题 POJ 1611

题意:有n(n<=30000)个学生,每个学生属于一个团体(可以属于多个团体),共有m(<=500)个团体,如果一个学生是嫌疑人,则他所在的团体的所有人都是嫌疑人,初始时0号学生是嫌疑人.问总共有多少个嫌疑人. 很明显同一个团体的学生可以连一条边,即求0号点所在的连通块有多少个点,用并查集可以很方便的办到,如果两个点属于同一个连通块则把他们的代表元连接起来即可,始终把较小的那个节点作为父节点,所以最后p[0]的节点数就是答案. 代码:

并查集水题 POJ2524

题意:一所学校有有n个学生,询问m对学生的宗教是否相同,求出这所学校最多有多少种宗教. 把宗教相同的学生连一条边,则未询问的学生默认他们没有边,最后连通块的个数就是宗教最多有多少个,并查集实现,把每个节点的最终父节点存到数组里,数组里不同元素的个数即为连通块的个数. 代码:

hdu 1213 并查集 水

http://acm.hdu.edu.cn/showproblem.php?pid=1213 做到一道网赛题 2-sat可写 貌似并查集也可写  但是并查集做法没想到 先水几道并查集重新理解下然后再去做 学到的就一点  Father数组中有些值一直保持最初的father[x] == x  最终集合的个数可以通过这个判断 #include <cstdio> #include <cstring> #include <algorithm> #include <iostr

poj2524(并查集水题)

题目链接:http://poj.org/problem?id=2524 题目大意:学校共有n个同学,告诉你m对同学信仰同一宗教,问这个学校学生信仰宗教的数目最多为多少. 例: Sample Input 10 91 21 31 41 51 61 71 81 91 1010 42 34 54 85 80 0 Sample Output Case 1: 1Case 2: 7 解题思路:直接套并查集的板子就可以了,初始化n个集合默认他们都信任不一样的宗教,初始就用n个宗教,每次给你的两个同学那个号码将他

51nod 1276 一个标签是并查集但跟并查集没有关系的3级题

(1)a,b排序的原因是比较快. (2)visit每次枚举询问不需要初始化的原因:b是升序排列的,枚举到b(i)时前面已经被淹没的岛屿仍然被淹没. (3)ans=1的原因是在b=0是仅存在一个大岛屿. (4)整个问题存在四种情况 1)第一个岛屿被淹没,这时如果第2个岛屿早已经被淹没了,就说明第一个岛屿被淹没以前是孤立存在的,现在被淹没了,那么ans当然要--: 2) 最后一个岛屿被淹没,这时如果第n-1个岛屿早已经被淹没了,同2). 3) 中间的一个岛屿被淹没了,如果前一个岛屿和后一个岛屿早已经

POJ2524并查集水题

Description There are so many different religions in the world today that it is difficult to keep track of them all. You are interested in finding out how many different religions students in your university believe in. You know that there are n stud

hdu 4496 并查集 反向并查集 水题 D-City

觉得这道题以后可以和优先队列结合起来 嗯 就是说依次去掉前n条路求连通块数量 处理的时候  只要每次merge发现父亲不相等 然后进到里面合并的时候 num-- wa了好几次是因为最后输出的时候开了点的数量大小的数组而不是操作数量数组 orz D-City Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Submission(s): 5334    Accepted