HDU4514 湫湫系列故事——设计风景线 ——树的直径/树形dp+判环
中文题面,给出一个图,问能不能成环,如果可以就输出YES。否则输出该树的直径。
这里的判环我们用路径压缩的并查集就能很快的判断出来,可以在输入的同时进行判断。这题重点就是求树的直径。
树直径的性质可以参考https://blog.csdn.net/pi9nc/article/details/12394117 实现在代码求法上的就是:
假设 s-t这条路径为树的直径,或者称为树上的最长路
从任意一点u出发搜到的最远的点一定是s、t中的一点,然后在从这个最远点开始搜,就可以搜到另一个最长路的端点,即用两遍广搜就可以找出树的最长路
搜的时候要注意 ,什么时候该清空什么数组 在代码中有一定的解释
#include<iostream>
#include<vector>
#include<queue>
#include<string.h>
using namespace std;
#define p pair<int,int>
vector<p> a[];
bool pd[],pdd[]; //pd数组判断该点有没有遍历到 pdd数组是保证每一个点都要被遍历过
int dp[]; //dp值为以改点为起点最长路径,在第一次找端点遍历后要清零
int ans,mark,anss;//annss为最终答案,mark用来标记第一次bfs找到的树的直径的端点
int bfs(int u)
{
ans=;
memset(pd,false,sizeof(pd));
memset(dp,false,sizeof(dp));
pd[u]=pdd[u]=;
queue<int> q;
q.push(u);
while(q.size()!=)
{
int t=q.front();
q.pop();
for(int i=;i<a[t].size();i++)
{
int v=a[t][i].first;
if(pd[v]) continue;
int w=a[t][i].second;
//cout<<"w="<<w<<endl; pd[v]=pdd[v]=;
dp[v]=dp[t]+w;
if(ans<dp[v])
{
ans=dp[v];
mark=v;
}
q.push(v);
}
}
return mark;
}
int f[];//压缩路径并查集
int die(int u)
{
if(f[u]==u) return u;
f[u]=die(f[u]);
return f[u];
}
int main()
{
int i,j,k,l,x,y,n,huan,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(pdd,false,sizeof(pdd));
huan=;anss=;
int u,v,c;
for(i=;i<=n;i++) f[i]=i,a[i].clear();//初始化father数组,同时清空上个输入留下的关系路径
for(i=;i<=m;i++)
{
scanf("%d%d%d",&u,&v,&c);
x=die(u);y=die(v);
if(x!=y) f[x]=y;
else huan=; //代表能成环
a[u].push_back(p(v,c));
a[v].push_back(p(u,c));
}
if(huan)
{
printf("YES\n");
continue;
}
for(i=;i<=n;i++) //循环保证所有的点都被遍历过
{
if(!pdd[i])
{
int sb=bfs(i);
// cout<<ans<<endl;
// cout<<"sb="<<sb<<endl;
int hp=bfs(sb);
// cout<<ans<<endl;
anss=max(anss,dp[hp]);
}
} printf("%d\n",anss); } }
HDU4514 湫湫系列故事——设计风景线 ——树的直径/树形dp+判环的更多相关文章
- 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)Tot ...
- 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) To ...
- 刷题总结——湫湫系列故事——设计风景线(hdu4514 并差集判环+树的直径)
题目: 随着杭州西湖的知名度的进一步提升,园林规划专家湫湫希望设计出一条新的经典观光线路,根据老板马小腾的指示,新的风景线最好能建成环形,如果没有条件建成环形,那就建的越长越好. 现在已经勘探 ...
- HDU 4514 - 湫湫系列故事——设计风景线 - [并查集判无向图环][树形DP求树的直径]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4514 Time Limit: 6000/3000 MS (Java/Others) Memory Li ...
- hdu 4514 湫湫系列故事――设计风景线(求树的直径)
随着杭州西湖的知名度的进一步提升,园林规划专家湫湫希望设计出一条新的经典观光线路,根据老板马小腾的指示,新的风景线最好能建成环形,如果没有条件建成环形,那就建的越长越好. 现在已经勘探确定了n个位置 ...
- 「日常训练」湫湫系列故事——设计风景线(HDU-4514)
题意与分析 中文题目,木得题意的讲解谢谢. 然后还是分解成两个任务:a)判环,b)找最长边. 对于这样一个无向图,强行转换成负权然后bellman-ford算法求最短是难以实现的,所以感谢没有环--我 ...
- HDU - 4514 湫湫系列故事——设计风景线(并查集判环)
题目: 随着杭州西湖的知名度的进一步提升,园林规划专家湫湫希望设计出一条新的经典观光线路,根据老板马小腾的指示,新的风景线最好能建成环形,如果没有条件建成环形,那就建的越长越好. 现在已经勘探确定了n ...
随机推荐
- python摸爬滚打之day032 管道 数据共享 进程池
1.进程池 当有成千上万个任务需要被执行的时候,有了进程池我们就不必去创建大量的进程. 首先,创建进程需要消耗时间,销毁进程(空间,变量,文件信息等等的内容)也需要消耗时间, 第二即便开启了成千上万的 ...
- Win10 +gtx1660 +CUDA10.0+CNDNN7.5+Tensorflow 1.13.1
硬件环境:ASUS Z370 + i7 8700K + 16G + GTX1660 软件环境:win10 x64 anaconda 3.5 python 3.6 pycharm 201 ...
- vscode编译发布exe
命令1: dotnet build -r win-x64 命令2: dotnet publish -c Release -r win-x64 -r|--runtime:(window rid或者lin ...
- 对象是存入cookie中需要注意
直接把对象存入cookie中的话,会转为字符串的 cookie中保存的都是字符串 所以取出来后还需要进行转换,转换成对象 JSON.parse()进行转换
- python的库小全
环境管理 管理 Python 版本和环境的工具 p – 非常简单的交互式 python 版本管理工具. pyenv – 简单的 Python 版本管理工具. Vex – 可以在虚拟环境中执行命令. v ...
- NOT EXIST和NOT IN 和MINUS的用法
MINUS SELECT count(id) FROM householdstaffs s WHERE s.idcardno in( SELECT h.idcardno FROM households ...
- laravel中get()与 first()区别、collection与stdClass的区别
简单的,laravel里get()得到的是一组数据,first()得到的是一个model数据. 从形式上,laravel里每一个model数据(record),在取出的时候都是用的PHP的stdCla ...
- 安装完Ubuntu后要做的事情
Ubuntu 16.04安装完成后,还需要做一些配置才能愉快的使用,所以装完系统后还要进行一系列的优化. 1.删除libreoffice libreoffice虽然是开源的,但是Java写出来的off ...
- How to emulate a Raspberry Pi on your PC
How to emulate a Raspberry Pi on your PC I am very interested in trying simulators and emulators for ...
- 在windows+eclipse+git遇到的未修改文件被标记为已修改的问题
最近遇到2个具体的问题: 1.我们有个工程里面有几个外部jar包,这几个jar包经常会更新,更新的时候如果是在eclipse中执行的,由于windows文件机制,所以会报错无法覆盖这几个jar包.虽然 ...