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 ...
随机推荐
- 讨论mui 的 mui.init 与 mui.plusReady
先来看一段代码 (function(m, doc) { mui.plusReady(function(){ var self = plus.webview.currentWebview(); olti ...
- VisualStudioCode创建的asp.net core控制台程序部署到linux
1.asp.net core控制台程序 static void Main(string[] args) { ; ) { Console.WriteLine("Hello World!&quo ...
- 动态代理处理service
/* 动态代理处理service * 1.动态代理的核心是切面编程,去除重复代码: * 2.通过反射+注解可以灵活的获取传入对象内容: * 3.通过try+catch将多个操作包裹,实现事物的原子性: ...
- Linux的top命令学习【转载】
转自:https://blog.csdn.net/sanshiqiduer/article/details/1933625 1.top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的 ...
- JavaScript实现RSA加解密
在GitHub上找到jsencrypt.js对RSA加解密的工具文件,地址分别是:https://github.com/travist/jsencrypt和https://github.com/ope ...
- session 和 cookie
在web请求中,很多的时候服务器需要知道来访的客户是谁,但是HTTP协议本身是不带认证的(ftp协议需要用户密码),因此cookie和session诞生了. session是解决http协议无状态 ...
- git二、基本使用
1:创建仓库 git init - 当前目录下初始化仓库,根目录产生.git文件-包含元数据文件,为其他git命令提供环境 2:克隆仓库 git clone url - 拷贝一个 Git 仓库到本 ...
- CentOS7中OpenVPN的配置
最近需要在openstack中集成openvpn功能,故熟悉了一下openvpn的搭建流程,记录下来,供参考 版本:openvpn-2.3.4.tar.gz 下载地址:http://pan.baidu ...
- SQL 一列数据整合为一条数据
SQL 一列数据整合为一条数据: SELECT STUFF(( SELECT distinct ',' + 列名 FROM 表名 where [条件] FOR XML PATH('') ), 1 ...
- Scala字节数组转换为数字
1. 2个字节数组转换为整数 def bytes2uint8(_bytes: Array[Byte], _offset: Int): Int = { val b0 = _bytes(_offset) ...