POJ 1935 Journey 树形DP
来源:互联网 发布:阿里云app测试平台 编辑:程序博客网 时间:2024/04/29 05:35
题意:一个国家中的城市以树形结构连接,选定一定要旅游的城市,在首都出发, 问环游的最短路径(可以不停止在起点)。
做法:建立两个状态,从i点出发回到i点和不回,这样就可以了
#include<cstdio>#include<cstring>const int LMT=50002;int sum[2][LMT],next[LMT],all,is[LMT];struct line{int u,v,next,len;}e[LMT<<1];void init(void){memset(is,0,sizeof(is));memset(sum,0,sizeof(sum));memset(next,-1,sizeof(next));all=0;}void insert(int u,int v,int len){e[all].u=u;e[all].v=v;e[all].len=len;e[all].next=next[u];next[u]=all++;}void dfs(int u,int pre){int v,x,len,tem;for(x=next[u];x!=-1;x=e[x].next)if(e[x].v!=pre){v=e[x].v;len=e[x].len;dfs(v,u);if(is[v]){ tem=len+sum[0][u]+sum[1][v]; if(sum[1][u]+sum[0][v]+(len<<1)>tem) sum[1][u]=tem; else sum[1][u]=sum[1][u]+sum[0][v]+(len<<1); sum[0][u]+=(len<<1)+sum[0][v];is[u]=1;}}}int main(void){int k,n,i,u,v,len,m;while(~scanf("%d%d",&n,&k)){init();for(i=1;i<n;++i){scanf("%d%d%d",&u,&v,&len);insert(u,v,len);insert(v,u,len);}scanf("%d",&m);for(i=1;i<=m;i++){scanf("%d",&u);is[u]=1;}dfs(k,-1);printf("%d\n",sum[1][k]);}return 0;}
- POJ 1935 Journey 树形DP
- poj 1935 journey 树DP
- POJ 1935 树形DP
- poj 1935 树形dp,
- poj 1935(树形dp)
- POJ 1935 树形DP
- BZOJ 2657 ZJOI2012 旅游(journey) 树形DP
- POJ 1935 Journey
- poj 1935 Journey
- POJ 1935 Journey 笔记
- poj 1770 树形dp
- poj 3342 树形DP
- poj 2486 树形dp
- poj 2486 树形DP
- 【树形dp】POJ 1463
- poj 2486 树形dp
- poj 3140 树形dp
- POJ 2152(树形DP)
- HDU 1210 Eddy's 洗牌问题
- 设备驱动程序通知应用程序的几种方法
- error C3163: “_vsnprintf”: 属性与以前的声明不一致
- 【openjudge】数字统计
- OpenCV的三帧差法
- POJ 1935 Journey 树形DP
- ajax入门示例
- 浅谈网络语音技术
- 一张图让你看懂工资单
- CE6.0用户态驱动和应用程序访问物理内存的方法
- IOS第十五天——Hello World实例
- c++中STL排序算法程序
- 异常:android.os.NetworkOnMainThreadException
- Windows CE的学习路线