HDU 4514 湫湫系列故事——设计风景线(并查集+树形DP)
湫湫系列故事——设计风景线
Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 4669 Accepted Submission(s): 853
现在已经勘探确定了n个位置可以用来建设,在它们之间也勘探确定了m条可以设计的路线以及他们的长度。请问是否能够建成环形的风景线?如果不能,风景线最长能够达到多少?
其中,可以兴建的路线均是双向的,他们之间的长度均大于0。
接下去m行,每行3个数字u v w,分别代表这条线路的起点,终点和长度。
[Technical Specification]
1. n<=100000
2. m <= 1000000
3. 1<= u, v <= n
4. w <= 1000
题目链接:HDU 4514
对于有圈的情况,在输入的时候直接用并查集判断即可,对于求图的最长路,以前是用一次DFS后再从最大长度点BFS,到这题就直接超时了……于是去膜了一下树形DP的解法,对于任意一个点U所在其下的子图G均可以求其中最长路与次长路,相加为G中最长路,显然最长路有一个最优子结构性质:当前点U的最长路一定是邻接点V的最长路加上当前到邻接点的长度,为什么?如果把U当作转折点,把其他路平均地“折”到U的左边和右边,那就是左边的最远点到右边的最远点的距离,显然左右两边的最远点在整个图里来说一个将成为最远点,一个成为次远点,这样以来便可以用DFS解决,题目所给的无向图好像可能不是一个连通图,而是多个连通分量,搜索的时候用vis标记一下就好了
代码:
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <sstream>
#include <numeric>
#include <cstring>
#include <bitset>
#include <string>
#include <deque>
#include <stack>
#include <cmath>
#include <queue>
#include <set>
#include <map>
using namespace std;
#define INF 0x3f3f3f3f
#define LC(x) (x<<1)
#define RC(x) ((x<<1)+1)
#define MID(x,y) ((x+y)>>1)
#define CLR(arr,val) memset(arr,val,sizeof(arr))
#define FAST_IO ios::sync_with_stdio(false);cin.tie(0);
typedef pair<int, int> pii;
typedef long long LL;
const double PI = acos(-1.0);
const int N = 100010;
const int M = 1000010;
struct edge
{
int to, nxt, dx;
edge() {}
edge(int To, int Nxt, int Dx): to(To), nxt(Nxt), dx(Dx) {}
};
edge E[M << 1];
int head[N], tot;
int dp[N][2];
int pre[N];
bitset<N>vis; void init()
{
CLR(head, -1);
tot = 0;
CLR(dp, 0);
CLR(pre, -1);
vis.reset();
}
int Find(int n)
{
if (pre[n] == -1)
return n;
return pre[n] = Find(pre[n]);
}
bool joint(int a, int b)
{
a = Find(a), b = Find(b);
if (a == b)
return false;
pre[a] = b;
return true;
}
inline void add(int s, int t, int d)
{
E[tot] = edge(t, head[s], d);
head[s] = tot++;
}
void dfs(const int &u, const int &pre)
{
vis[u] = true;
for (int i = head[u]; ~i; i = E[i].nxt)
{
int v = E[i].to;
if (v != pre)
{
dfs(v, u);
int temp = dp[v][0] + E[i].dx;
if (temp > dp[u][0])
{
dp[u][1] = dp[u][0];
dp[u][0] = temp;
}
else if (temp > dp[u][1])
dp[u][1] = temp;
}
}
}
int main(void)
{
int n, m, a, b, c, i;
while (~scanf("%d%d", &n, &m))
{
init();
bool ok = true;
for (i = 0; i < m; ++i)
{
scanf("%d%d%d", &a, &b, &c);
add(a, b, c);
add(b, a, c);
if (!joint(a, b))
ok = false;
}
if (!ok)
puts("YES");
else
{
for (i = 1; i <= n; ++i)
if (!vis[i])
dfs(i, -1);
int ans = -INF;
for (i = 1; i <= n; ++i)
if (dp[i][0] + dp[i][1] > ans)
ans = dp[i][0] + dp[i][1];
printf("%d\n", ans);
}
}
return 0;
}
HDU 4514 湫湫系列故事——设计风景线(并查集+树形DP)的更多相关文章
- HDU 4514 - 湫湫系列故事——设计风景线 - [并查集判无向图环][树形DP求树的直径]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4514 Time Limit: 6000/3000 MS (Java/Others) Memory Li ...
- HDU4514 湫湫系列故事——设计风景线 ——树的直径/树形dp+判环
中文题面,给出一个图,问能不能成环,如果可以就输出YES.否则输出该树的直径. 这里的判环我们用路径压缩的并查集就能很快的判断出来,可以在输入的同时进行判断.这题重点就是求树的直径. 树直径的性质可以 ...
- HDU 4514 湫湫系列故事——设计风景线 树的直径
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4514 湫湫系列故事--设计风景线 Time Limit: 5000/2000 MS (Java/Ot ...
- Hdu 4514 湫湫系列故事——设计风景线
湫湫系列故事--设计风景线 Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total ...
- hdu-----(4514)湫湫系列故事——设计风景线(树形DP+并查集)
湫湫系列故事——设计风景线 Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Tot ...
- hdu 4514 并查集+树形dp
湫湫系列故事——设计风景线 Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Tot ...
- HDU 4539郑厂长系列故事――排兵布阵(状压DP)
HDU 4539 郑厂长系列故事――排兵布阵 基础的状压DP,首先记录先每一行可取的所哟状态(一行里互不冲突的大概160个状态), 直接套了一个4重循环居然没超时我就呵呵了 //#pragma co ...
- hdu 4514 湫湫系列故事――设计风景线(求树的直径)
随着杭州西湖的知名度的进一步提升,园林规划专家湫湫希望设计出一条新的经典观光线路,根据老板马小腾的指示,新的风景线最好能建成环形,如果没有条件建成环形,那就建的越长越好. 现在已经勘探确定了n个位置 ...
- HDU - 4514 湫湫系列故事——设计风景线(并查集判环)
题目: 随着杭州西湖的知名度的进一步提升,园林规划专家湫湫希望设计出一条新的经典观光线路,根据老板马小腾的指示,新的风景线最好能建成环形,如果没有条件建成环形,那就建的越长越好. 现在已经勘探确定了n ...
随机推荐
- flash + php对称密钥加密的交互
这几天研究了下php和flash中的对称密钥加密的交互问题,经过研究以后决定,在项目中使用aes加密.问题也就来了,在flash中的加密数据如何与php的amf进行数据交互,最终决定使用base64编 ...
- Mint UI文档
Mint UI文档:http://elemefe.github.io/mint-ui/#/ 一.Mint UI的安装和基本用法. 1.NPM :npm i mint-ui -S 建议使用npm进行安装 ...
- 牛客NOIP提高组R1 A中位数(二分)
题意 题目链接 Sol 很神仙的题目啊,考场上只会$n^2$的暴力.. 考虑直接二分一个$mid$,我们来判断最终答案是否可能大于$x$. 判断的时候记录一下前缀最小值即可, 设$s[i]$表示$1- ...
- 问题:Could not install packages due to an EnvironmentError: [Errno 13] Permission denied:
1.安装django 执行pip3 install --user django 2.解决方法:加--user 执行pip3 install --user django
- php 获取 今天、昨天、这周、上周、这月、上月、近30天
<?php //今天 $today = date("Y-m-d"); //昨天 $yesterday = date("Y-m-d", strtotime( ...
- (转)Windows 支持 DirectX 和 OpenGL,为什么大多数 PC 游戏还是 DirectX 开发?
事实上在早年OpenGL即使在游戏领域也是对DirectX压倒性的优势.John Carmack曾嘲讽DirectX是"horribly broken" 的API.直到Direct ...
- 课时21.img标签(掌握)
1.img标签中的img其实是英文image的缩写,所以img标签的作用,就是告诉浏览器我们需要显示一张图片 2.img标签格式:<img src=" "> img是 ...
- 将Excel文件转为csv文件的python脚本
#!/usr/bin/env python __author__ = "lrtao2010" ''' Excel文件转csv文件脚本 需要将该脚本直接放到要转换的Excel文件同级 ...
- Python 格式化
数字前面补0 字符型: print('23'.zfill(5)) 数字型: print('%011d' % 124) 日期与str互转: datetime 转 str str_date = datet ...
- linux安装vmware出现kernel-header问题
查看日志文件, cat /tmp/vmware-xiuyuan/vmware-modconfig-9996.log | more在日志文件中有这么几行:Setting header path for ...