「日常训练」湫湫系列故事——设计风景线(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个位置 ...
随机推荐
- luogu P1642 规划
嘟嘟嘟 看到最后让求一个比值,应该得往01规划上去想.令x = ∑v[i] / ∑c[i],则x * ∑c[i] = ∑v[i], ∑(v[i] - x * c[i]) = 0. 于是可以二分x(注意 ...
- MyBatis(8)延迟加载&缓存
什么是延迟加载? resultMap可以实现高级映射,association,collection具有延迟加载的功能. 当我们需要查询某个信息的时候,再去查询,达到按需查询,就是延迟加载 可以 ...
- springmvc小结(下)
1.@ModelAttribute 1.给共享的数据设置model数据设置,贴在形参上,也可以贴在方法上,设置一个model的key值 2.当controller方法返回一个对象的时候,,缺省值会把当 ...
- webpack执行命令失败之解决办法
错误信息:ERROR in multi ./runoob1.js bundle.js Module not found: Error: Can't resolve 'bundle.js' in 'C: ...
- 转发forward和重定向redirect的区别
本质区别:转发只发送一次请求,重定向发送两次请求. 转发: request.getRequestDispatcher("/HiServlet").forward(request,r ...
- [转]ASP.NET如何获取上传图片尺寸(是指宽高)
1.采用客户端javascript可以取得图片大小 <input id="FileUpload" type="file" size="27&qu ...
- 【题解】洛谷P1315 [NOIP2011TG] 观光公交(前缀和+贪心)
次元传送门:洛谷P1315 思路 思路大概想到了 可是代码实现却没想到 所以参考题解了 D2T3的贪心果然有难度 我们考虑在每次用加速器有两种情况 到下一个点还需要等待:以后的时间就不再影响了 到下一 ...
- imageNamed和dataWithContentsOfFile的区别(1)
imageNamed和dataWithContentsOfFile的区别 imagecacheuiviewextensionprocessingxcode 最近老是受iphone内存问题的困扰,找了些 ...
- vue+webpack搭建项目
1.全局安装node.js 2.安装vue-cli 可以在项目目录安装 npm install -g vue-cli 使用vue-list命令选择webpack模板 vue init webpack ...
- 如何在html中插入图片
HTML内容元素中图片元素 使用img元素:src属性:图片路径. alt属性:图片无法显示的时候使用替代文本,title属性:鼠标悬停时显示文本内容. 在同一张图片上点击不同的位置链接到不同的页面上 ...