「日常训练」湫湫系列故事——设计风景线(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个位置 ...
随机推荐
- Redis数据类型(下)
集合Set Redis 的集合不是 个线性结构,而是一个哈希表结构,它的内部会根据 hash 分子来 存储和查找数据,理论上 个集合可以存储 232 (大约 42 亿)个元素,因为采用哈希表结 ...
- 快速理解Event事件
浏览器事件是所有web程序的核心.javascript与HTML之间的交互是通过事件实现的.通过这些事件我们定义将要发生的行为.事件是一种异步编程的实现方式,本质上是程序各个组成部分之间的通信. 1. ...
- 强大的Windows 10数字权利获取工具HWIDGEN
前言: 每当windows 10 系统过期就是头疼的key激活,更奇怪的是每次激活的方式不同,上次有效下次就不知道有没有效了,今天发现一种更改数字权利的工具脚本,不要太牛逼!!! 安装之前的准备工作: ...
- git提交项目
https://www.cnblogs.com/java-maowei/p/5950930.html
- 【洛谷P2123】皇后游戏
题目链接 这题的 实际上和"流水调度问题"是一样的 (我是不会告诉你我是看了讨论才知道的) 于是我就翻开了我们教练弄来的一本蓝不拉几的叫做"信息学奥赛一本通·提高篇&qu ...
- javascript中filter方法
array1.filter(callbackfn[, thisArg]) 參數 參數 定義 array1 必要項. 陣列物件. callbackfn 必要項. 最多接受三個引數的函式. filte ...
- STM32F103 ucLinux开发之一(BOOT分析及源码)
STM32F103 ucLinux开发BOOT STM3210E-EVAL官方开发板主芯片STM32F103ZET6: 片内512K Flash,地址0x0800 0000 ~ 0x0807 FFFF ...
- 微信小程序获取手机信息
wx.getSystemInfo({ success: function (res) { console.log(res.model)//手机型号 console.log(res.pixelRatio ...
- Paxos一致性算法(三)
一.概述: Google Chubby的作者说过这个世界只有一种一致性算法,那就Paxos算法,其他的都是残次品. 二.Paxos算法: 一种基于消息传递的高度容错性的一致性算法. Paxos:少数服 ...
- Oracle作业3 —— 简单查询
一.创建学生表 CREATE TABLE STUDENTS( STU_ID ) CONSTRAINTS PK_STUS_ID PRIMARY KEY, STU_NAME ) NOT NULL, STU ...