湫湫系列故事——设计风景线

Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 4539    Accepted Submission(s): 816

Problem Description
  随着杭州西湖的知名度的进一步提升,园林规划专家湫湫希望设计出一条新的经典观光线路,根据老板马小腾的指示,新的风景线最好能建成环形,如果没有条件建成环形,那就建的越长越好。
  现在已经勘探确定了n个位置可以用来建设,在它们之间也勘探确定了m条可以设计的路线以及他们的长度。请问是否能够建成环形的风景线?如果不能,风景线最长能够达到多少?
  其中,可以兴建的路线均是双向的,他们之间的长度均大于0。
 
Input
  测试数据有多组,每组测试数据的第一行有两个数字n, m,其含义参见题目描述;
  接下去m行,每行3个数字u v w,分别代表这条线路的起点,终点和长度。

  [Technical Specification]
  1. n<=100000 
  2. m <= 1000000
  3. 1<= u, v <= n 
  4. w <= 1000

 
Output
  对于每组测试数据,如果能够建成环形(并不需要连接上去全部的风景点),那么输出YES,否则输出最长的长度,每组数据输出一行。
 
Sample Input
3 3
1 2 1
2 3 1
3 1 1
 
Sample Output
YES
  1. /*
  2. hdu 4514 并查集+树形dp
  3.  
  4. problem:
  5. 给你一个图,如果其中有环,则输出YES. 否则输出其中最长链的长度
  6.  
  7. solve:
  8. 通过并查集可以判断是否有环. 树形dp计算经过当前节点最长链的长度.
  9.  
  10. hhh-2016-08-24 21:02:37
  11. */
  12. #pragma comment(linker,"/STACK:124000000,124000000")
  13. #include <algorithm>
  14. #include <iostream>
  15. #include <cstdlib>
  16. #include <cstdio>
  17. #include <cstring>
  18. #include <vector>
  19. #include <math.h>
  20. #include <queue>
  21. #include <map>
  22. #define lson i<<1
  23. #define rson i<<1|1
  24. #define ll long long
  25. #define clr(a,b) memset(a,b,sizeof(a))
  26. #define scanfi(a) scanf("%d",&a)
  27. #define scanfl(a) scanf("%I64d",&a)
  28. #define key_val ch[ch[root][1]][0]
  29. #define inf 0x3f3f3f3f
  30. #define mod 1000003
  31. using namespace std;
  32. const int maxn = 100010;
  33. int fa[maxn];
  34. int head[maxn];
  35. int dp[maxn];
  36. int tot ;
  37. void ini()
  38. {
  39. tot = 0;
  40. memset(head,-1,sizeof(head));
  41. memset(fa,-1,sizeof(fa));
  42. memset(dp,-1,sizeof(dp));
  43. }
  44. struct node
  45. {
  46. int to,w,next;
  47. } edge[maxn*20];
  48. void add_edge(int u,int v,int w)
  49. {
  50. edge[tot].to = v,edge[tot].w = w,edge[tot].next = head[u],head[u] = tot ++;
  51. }
  52.  
  53. int fin(int x)
  54. {
  55. if(fa[x] == -1) return x;
  56. return fa[x] = fin(fa[x]);
  57. }
  58. int tans = 0;
  59.  
  60. int dfs(int now,int far)
  61. {
  62. int tnex = 0;
  63. for(int i = head[now]; ~i; i = edge[i].next)
  64. {
  65. int v = edge[i].to;
  66. if(v == far)
  67. continue;
  68. int re = dfs(v,now);
  69. tans = max(tans,tnex+re +edge[i].w);
  70. tnex = max(tnex,re + edge[i].w);
  71. }
  72. return dp[now] = tnex;
  73. }
  74.  
  75. int main()
  76. {
  77. int n,m;
  78. int u,v,w;
  79. // freopen("in.txt","r",stdin);
  80. while(scanfi(n) != EOF)
  81. {
  82. scanfi(m);
  83. ini();
  84. int flag =0 ;
  85. for(int i = 1; i <= m; i++)
  86. {
  87. scanfi(u),scanfi(v),scanfi(w);
  88. add_edge(u,v,w);
  89. add_edge(v,u,w);
  90. int ta = fin(u);
  91. int tb = fin(v);
  92. if(ta == tb)
  93. flag = 1;
  94. else
  95. fa[ta] = tb;
  96. }
  97. tans = 0;
  98. if(flag)
  99. printf("YES\n");
  100. else
  101. {
  102. for(int i =1; i <= n; i++)
  103. {
  104. if(dp[i] == -1)
  105. {
  106. dfs(i,-1);
  107. // cout <<tans << endl;
  108. }
  109. }
  110. printf("%d\n",tans);
  111. }
  112. }
  113. return 0;
  114. }

  

hdu 4514 并查集+树形dp的更多相关文章

  1. Codeforces 1156D 0-1-Tree ( 并查集 || 树形DP )

    <题目链接> 题目大意: 给定一颗无向树,树的边权只要0/1两种情况,现在问你这棵树上存在多少对有序对<u,v>,满足u-->v的路径上,如果出现边权为1的边之后,就不能 ...

  2. HDU 4514 湫湫系列故事——设计风景线(并查集+树形DP)

    湫湫系列故事——设计风景线 Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) To ...

  3. HDU 5575 Discover Water Tank 并查集 树形DP

    题意: 有一个水槽,边界的两块板是无穷高的,中间有n-1块隔板(有高度),现有一些条件(i,y,k),表示从左到右数的第i列中,在高度为(y+0.5)的地方是否有水(有水:k = 1),问最多能同时满 ...

  4. BZOJ_2443_[Usaco2011 Open]奇数度数 _并查集+树形DP

    BZOJ_2443_[Usaco2011 Open]奇数度数 _并查集. Description 奶牛们遭到了进攻!在他们的共和国里,有N(1 <= N <=50,000)个城市,由M(1 ...

  5. P2700逐个击破(并查集/树形dp)

    P2700 逐个击破 题目背景 三大战役的平津战场上,傅作义集团在以北平.天津为中心,东起唐山西至张家口的铁路线上摆起子一字长蛇阵,并企图在溃败时从海上南逃或向西逃窜.为了就地歼敌不让其逃走,老毛同志 ...

  6. HDU 4514并查集判环+最长路

    点击打开链接 题意:中文题...... 思路:先推断是否能成环,之前以为是有向图,就用了spfa推断,果断过不了自己出的例子,发现是无向图.并查集把,两个点有公共的父节点,那就是成环了,之后便是求最长 ...

  7. HDU 3926 并查集 图同构简单判断 STL

    给出两个图,问你是不是同构的... 直接通过并查集建图,暴力用SET判断下子节点个数就行了. /** @Date : 2017-09-22 16:13:42 * @FileName: HDU 3926 ...

  8. HDU 4496 并查集 逆向思维

    给你n个点m条边,保证已经是个连通图,问每次按顺序去掉给定的一条边,当前的连通块数量. 与其正过来思考当前这边会不会是桥,不如倒过来在n个点即n个连通块下建图,检查其连通性,就能知道个数了 /** @ ...

  9. [HDU 5293]Tree chain problem(树形dp+树链剖分)

    [HDU 5293]Tree chain problem(树形dp+树链剖分) 题面 在一棵树中,给出若干条链和链的权值,求选取不相交的链使得权值和最大. 分析 考虑树形dp,dp[x]表示以x为子树 ...

随机推荐

  1. 2018上c语言第0次作业

    随笔: 1.翻阅邹欣老师博客关于师生关系博客,并回答下列问题,每个问题的答案不少于500字: (1)最理想的师生关系是健身教练和学员的关系,在这种师生关系中你期望获得来自老师的哪些帮助? 答:对此问题 ...

  2. android 广播安装指定下载的apk

    // 广播出去,由广播接收器来处理下载完成的文件   Intent sendIntent = new Intent("com.test.downloadComplete");    ...

  3. GPUImage实战问题解决

    在项目中遇到了使用完GPUImage以后,内存不释放的问题,翻阅官方API,找到了解决方法: deinit{ GPUImageContext.sharedImageProcessingContext( ...

  4. python使用tesseract-ocr完成验证码识别(模型训练和使用部分)

    一.Tesseract训练 大体流程为:安装jTessBoxEditor -> 获取样本文件 -> Merge样本文件 –> 生成BOX文件 -> 定义字符配置文件 -> ...

  5. 流程控制语句(MySQL/MariaDB )

    本文目录:1.BEGIN...END2.true和false3.if结构4.case结构5.loop.leave和iterate6.repeat循环7.while循环 MySQL/MariaDB中的符 ...

  6. 第二章 JavaScript核心语法

    第二章   avaScript核心语法 一.变量的声明和赋值 JavaScript是一种弱类型语言,没有明确的数据类型,也就是在声明变量时不需要指定数据类型,变量的类型由赋给变量的值决定. 在Java ...

  7. Mego(06) - 关系数据库建模

    框架中提供了多种数据注释以便可以全面的描述数据库结构特性. 自增列 可以使用注释声明指定列是数据库自增列,同时能指定自增的起始及步长. public class Blog { [Identity(, ...

  8. 新概念英语(1-131)Don't be so sure

    Lesson 131 Don't be so sure! 别那么肯定! Listen to the tape then answer this question. What's the problem ...

  9. Pyhon之Django中的Form组件

    Pyhon之Django中的Form组件   新手上路 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面 ...

  10. Node.js初探之实现能向前台返回东西的简单服务器

    nodejs nodejs文件就是一个简单的js文件. 在shell中运行 Step 1. 打开终端,进入这个js文件所在目#录 Step 2. 用 'node 文件名.js' 命令运行它即可. 用n ...