「日常训练」湫湫系列故事——设计风景线(HDU-4514)
题意与分析
中文题目,木得题意的讲解谢谢。
然后还是分解成两个任务:a)判环,b)找最长边。
对于这样一个无向图,强行转换成负权然后bellman-ford算法求最短是难以实现的,所以感谢没有环——我们可以当作一棵树来做,然后就直接是树的直径的做法了。
这里同之前的题解的思路不一样的是,采用了动态规划的思路来做树的直径。
记\(dp[now][0]\)为从now出发的最长路径,而\(dp[now][1]\)是从now出发的次长路径。
对从now走出来的每条路径都有做一次判断,首先判断它是否比当前最长的路径的长,如果是,那么它变最长当前最长变次长;如果它比最长短(这个很重要,否则会出现最长与次长的节点相重复),那么判断它是否比次长的长,如果是,更新之。
这样,每个过now的最长边就是\(dp[now][0]+dp[now][1]\),遍历一遍更新之。
值得注意的是,这题没有硬点只有一个连通分量。不要在这边翻车了。
代码
/*
* Filename: hdu4514.cpp
* Date: 2018-11-05
*/
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define PB emplace_back
#define MP make_pair
#define fi first
#define se second
#define rep(i,a,b) for(repType i=(a); i<=(b); ++i)
#define per(i,a,b) for(repType i=(a); i>=(b); --i)
#define ZERO(x) memset(x, 0, sizeof(x))
#define MS(x,y) memset(x, y, sizeof(x))
#define ALL(x) (x).begin(), (x).end()
#define QUICKIO \
ios::sync_with_stdio(false); \
cin.tie(0); \
cout.tie(0);
#define DEBUG(...) fprintf(stderr, __VA_ARGS__), fflush(stderr)
using namespace std;
using pi=pair<int,int>;
using repType=int;
using ll=long long;
using ld=long double;
using ull=unsigned long long;
int n,m;
const int MAXN=100005;
struct Edge
{
int u,v,w;
Edge() {}
Edge(int _u, int _v, int _w):
u(_u), v(_v), w(_w) {}
};
vector<Edge> edges;
vector<int> G[MAXN];
void add_edge(int u,int v,int w)
{
edges.PB(u,v,w);
G[u].PB(edges.size()-1);
}
int pa[MAXN];
int find_pa(int x)
{
return pa[x]==x?x:pa[x]=find_pa(pa[x]);
}
bool union_pa(int x,int y)
{
int fx=find_pa(x),
fy=find_pa(y);
if(fx!=fy) pa[fx]=fy;
else return false;
return true;
}
bool vis[MAXN];
int diameter, dp[MAXN][5];
void dfs(int now, int par)
{
vis[now]=true;
rep(i,0,int(G[now].size())-1)
{
Edge& e=edges[G[now][i]];
int nxt=e.v;
if(vis[nxt]) continue;
dfs(nxt,now);
if(dp[now][0]<dp[nxt][0]+e.w)
{
dp[now][1]=dp[now][0];
dp[now][0]=dp[nxt][0]+e.w;
}
else if(dp[now][1]<dp[nxt][0]+e.w)
dp[now][1]=dp[nxt][0]+e.w;
}
if(diameter<dp[now][0]+dp[now][1]) diameter=dp[now][0]+dp[now][1];
}
int
main()
{
while(scanf("%d%d", &n, &m)==2)
{
edges.clear(); rep(i,1,n) G[i].clear();
iota(pa+1,pa+n+1,1);
bool has_loop=false;
rep(i,1,m)
{
int u,v,w;
scanf("%d%d%d", &u, &v, &w);
if(has_loop) continue;
add_edge(u,v,w);
add_edge(v,u,w);
if(find_pa(u)!=find_pa(v))
{
union_pa(u,v);
}
else has_loop=true;
}
if(has_loop) printf("YES\n");
else
{
ZERO(vis);
ZERO(dp);
int ans=0;
rep(i,1,n) if(!vis[i])
{
diameter=0;
dfs(i,0);
ans=max(diameter,ans);
}
printf("%d\n", ans);
}
}
return 0;
}
「日常训练」湫湫系列故事——设计风景线(HDU-4514)的更多相关文章
- 湫湫系列故事——设计风景线 HDU - 4514
题目链接:https://vjudge.net/problem/HDU-4514 题意:判断没有没有环,如果没有环,通俗的讲就是找出一条最长的路,相当于一笔画能画多长. 思路:dfs判环. 最后就是没 ...
- 「日常训练」 不容易系列之(3)—— LELE的RPG难题 (HDU 2045)
题目简述 有排成一行的n" role="presentation">nn个方格,用红(Red).粉(Pink).绿(Green)三色涂每个格子,每格涂一色,要求任何 ...
- 「日常训练」 神、上帝以及老天爷 (HDU 2048)
题意 数论中的错排问题.记错排为Dn" role="presentation">DnDn,求Dnn!" role="presentation&q ...
- hdu-----(4514)湫湫系列故事——设计风景线(树形DP+并查集)
湫湫系列故事——设计风景线 Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Tot ...
- Hdu 4514 湫湫系列故事——设计风景线
湫湫系列故事--设计风景线 Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total ...
- HDU 4514 湫湫系列故事——设计风景线 树的直径
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4514 湫湫系列故事--设计风景线 Time Limit: 5000/2000 MS (Java/Ot ...
- HDU 4514 湫湫系列故事——设计风景线(并查集+树形DP)
湫湫系列故事——设计风景线 Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) To ...
- HDU 4514 - 湫湫系列故事——设计风景线 - [并查集判无向图环][树形DP求树的直径]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4514 Time Limit: 6000/3000 MS (Java/Others) Memory Li ...
- 「日常训练」ZgukistringZ(Codeforces Round #307 Div. 2 B)
题意与分析(CodeForces 551B) 这他妈哪里是日常训练,这是日常弟中弟. 题意是这样的,给出一个字符串A,再给出两个字符串B,C,求A中任意量字符交换后(不限制次数)能够得到的使B,C作为 ...
- hdu 4514 湫湫系列故事――设计风景线(求树的直径)
随着杭州西湖的知名度的进一步提升,园林规划专家湫湫希望设计出一条新的经典观光线路,根据老板马小腾的指示,新的风景线最好能建成环形,如果没有条件建成环形,那就建的越长越好. 现在已经勘探确定了n个位置 ...
随机推荐
- 生成并部署SSH key
1.如何生成ssh公钥 你可以按如下命令来生成 sshkey: ssh-keygen -t rsa -C "xxxxx@xxxxx.com" # Generating public ...
- 两种方式(xml+代码)构建SqlSessionFactory+完整实现
首先创建类.接口.数据库: entity包下Admin类: package com.wbg.springJavaConfig.entity; public class Admin { private ...
- PAT——1004. 成绩排名
原题目:https://www.patest.cn/contests/pat-b-practise/1004 读入n名学生的姓名.学号.成绩,分别输出成绩最高和成绩最低学生的姓名和学号. 输入格式:每 ...
- Java IP白名单相关工具类
关于设置IP白名单相关的一些方法,整理,记录了一下. package com.tools.iptool; import java.util.ArrayList; import java.util.Ha ...
- mysql 修改数据类型
只修改列的数据类型的方法: 通常可以写成 alter table 表名 modify column 列名 新的列的类型 例如:student表中列sname的类型是char(20),现在要修改为var ...
- 四、MapReduce 基础
是一个并行计算框架(计算的数据源比较广泛-HDFS.RDBMS.NoSQL),Hadoop的 MR模块充分利用了HDFS中所有数据节点(datanode)所在机器的内存.CUP以及少量磁盘完成对大数据 ...
- insert插入数据
insert 语法1 --插入的值需要用单引号引起来,否则字段插入会有问题,可能造成查询的时候查询不出结果 insert into 表名 (列名1,列名2……) ] values ( '值1' ...
- wps for linux 安装后系统缺失字体安装配置
错误提示: 解决方法: 从http://bbs.wps.cn/thread-22355435-1-1.html下载字体库,离线版本:(链接: https://pan.baidu.com/s/1i5dz ...
- Elasticsearch 5.x安装
node1 elasticsearch node2 elasticsearch node3 elasticsearch 前期准备 JDK1.8 修改/etc/security/limits.conf ...
- PHP的高效率写法
1.尽量静态化: 如果一个方法能被静态,那就声明它为静态的,速度可提高1/4,甚至我测试的时候,这个提高了近三倍. 当然了,这个测试方法需要在十万级以上次执行,效果才明显. 其实静态方法和非静态方法的 ...