[POJ 1935] Journey
Link:
Solution:
一道吓唬人的水题
注意这是一棵树,两点间仅有唯一的路径!
于是每个“关键点”和起点只有一条路径,想去起点另一棵子树上的节点必须要回到起点
如果必须要回到起点,答案$res$就是除去无用边后整棵树总距离$*2$,
因为不必回到起点,最终结果为$res-mx$,$mx$为距起点的最远点的距离
除去无用边的方式:给每个“关键点”打上$vis$标记,这样最远点之后的点就不会被$dfs$到了
Code:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <utility>
#include <vector> using namespace std;
typedef pair<int,int> P;
#define X first
#define Y second
const int MAXN=5e4+;
vector<P> G[MAXN];
int n,k,root,dist[MAXN],vis[MAXN],mx,res,x,y,z; void dfs(int u,int anc)
{
for(int i=;i<G[u].size();i++)
{
int v=G[u][i].X;
if(v==anc) continue;
dist[v]=dist[u]+G[u][i].Y;
dfs(v,u);
if(vis[v]) vis[u]=true,res+=G[u][i].Y*; //传递标记
}
} int main()
{
scanf("%d%d",&n,&root);
for(int i=;i<n;i++)
{
scanf("%d%d%d",&x,&y,&z);
G[x].push_back(P(y,z));G[y].push_back(P(x,z));
}
scanf("%d",&k);
for(int i=;i<=k;i++)
scanf("%d",&x),vis[x]=true; //打上标记
dfs(root,);
for(int i=;i<=n;i++)
if(vis[i]) mx=max(mx,dist[i]);
printf("%d",res-mx);
return ;
}
Review:
(1)对“树”这个条件中“两点之间只有一条路径”这个性质不够敏感,
因此未能看出到达一棵子树的最远点后必须要回到起点再出发这一推论
(2)除去无用边的方法很妙:设置$vis=true$,将更远的点截去
同时传递$vis$的值来更新答案
[POJ 1935] Journey的更多相关文章
- 【POJ】1935 Journey(树形dp)
题目 传送门:QWQ 分析 凉凉. 答案是所有要经过的点到根所经过的边权和减去最大的边权. 代码 vector好慢啊 #include <cstdio> #include <vect ...
- poj 1935(树形dp)
题目链接:http://poj.org/problem?id=1935 思路:首先我们考虑从源点出发到所有自己想要经过的点然后在回到源点sum,显然每条边都必须经过源点(这个我们可以一次dfs求出), ...
- poj 3544 Journey with Pigs
Journey with Pigs Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 3004 Accepted: 922 ...
- 树型DP(2)
声明 https://blog.csdn.net/no1_terminator/article/details/77824790 参考课件和讲授来自Accelerator 找树的直径 树的直径定义为一 ...
- 广大暑假训练1(poj 2488) A Knight's Journey 解题报告
题目链接:http://vjudge.net/contest/view.action?cid=51369#problem/A (A - Children of the Candy Corn) ht ...
- poj 2488 A Knight's Journey(dfs+字典序路径输出)
转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://poj.org/problem? id=2488 ----- ...
- POJ 1932 XYZZY (ZOJ 1935)SPFA+floyd
http://poj.org/problem?id=1932 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1935 题目大 ...
- POJ 2488 -- A Knight's Journey(骑士游历)
POJ 2488 -- A Knight's Journey(骑士游历) 题意: 给出一个国际棋盘的大小,判断马能否不重复的走过所有格,并记录下其中按字典序排列的第一种路径. 经典的“骑士游历”问题 ...
- A Knight's Journey 分类: POJ 搜索 2015-08-08 07:32 2人阅读 评论(0) 收藏
A Knight's Journey Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 35564 Accepted: 12119 ...
随机推荐
- ADB命令总结(1)
今日继续学习ADB,使用真机来操作,因此把所用到的命令总结如下: 一,模拟按HOME键 adb shell input keyevent KEYCODE_HOME 二,滑动手机屏幕 从(x1,y1)滑 ...
- Python 3基础教程8--if else、if elif else
本文介绍if else语句,不多说,直接看例子. if elif else语句
- Java基础-7数组
一).什么是数组: 数组是一组具有相同类型和名称的变量集合,把一系列相同类型的数据保存在一起,这些变量称为数组的元素:每个元素都有一个编号,这个编号叫做下标,下标从 0 开始:元素的个数被称为数组的长 ...
- 4.实现简单的shell sed替换功能
# -*- coding:utf-8 -*- # Author: JACK ZHAO # 程序1: 实现简单的shell sed替换功能 import sys #判断参数个数 if len(sys.a ...
- 整合S2SH框架
S2SH框架(Struts2,Spring,Hibernate)整合 Struts2.Hibernate和Spring.其中在Struts2部分主要为MVC设计思想,Struts2的处理流程及配置,S ...
- 解决IDEA2018.1.5或者Android Studio 3.0版本的输入法不跟随光标问题
问题1:IDEA2018.1.5版本的输入法不跟随光标 解决办法1:修改JDK版本,步骤如下: 1. 使用快捷键ctrl+shift+A,在输入框中输入Switch Boot JDK,如图所示 2.替 ...
- BeanUtils Date
在jdbc封装(基础的CRUD)的时候(查询一条数据,查询多条数据,更新....)经常会用到一个BeanUtil来设置属性值,当对象中存在Date类型的时候,会报错:如下: 2017-11-03 13 ...
- Tomcat学习笔记(四)
Servlet容器部分 servlet容器用来处理请求servlet资源,并为web客服端填充response对象模块,在tomcat中,共有4种类型的容器,分别是:Engine.Host.Conte ...
- 飞思卡尔MC9S12系列单片机地址影射以及分页问题
对于用MCU的人来说,不一定要明白HCS12(x) memory map的机制和联系.因为如果没有系统地学习操作系统和编译原理之类的课程,确实有些难度.并且,对于DG128 XS128这样的MCU,默 ...
- POJ1200 Crazy Search
Time Limit: 1000MS Memory Limit: 65536KB 64bit IO Format: %I64d & %I64u Description Many peo ...