LOJ10159旅游规划

题目描述

W 市的交通规划出现了重大问题,市政府下定决心在全市各大交通路口安排疏导员来疏导密集的车流。但由于人员不足,W 市市长决定只在最需要安排人员的路口安排人员。

具体来说,W 市的交通网络十分简单,由 n 个交叉路口和 n-1 条街道构成,交叉路口路口编号依次为 0,1,,n1 。任意一条街道连接两个交叉路口,且任意两个交叉路口间都存在一条路径互相连接。

经过长期调查,结果显示,如果一个交叉路口位于 W 市交通网最长路径上,那么这个路口必定拥挤不堪。所谓最长路径,定义为某条路径 p=(v1,v2,v3,,vk),路径经过的路口各不相同,且城市中不存在长度大于 k 的路径,因此最长路径可能不唯一。因此 W 市市长想知道哪些路口位于城市交通网的最长路径上。

输入格式

第一行一个整数 n;

之后 n-1 行每行两个整数 u,v,表示 u 和 v 的路口间存在着一条街道。

输出格式

输出包括若干行,每行包括一个整数——某个位于最长路径上的路口编号。为了确保解唯一,请将所有最长路径上的路口编号按编号顺序由小到大依次输出。

样例

样例输入

10
0 1
0 2
0 4
0 6
0 7
1 3
2 5
4 8
6 9

样例输出

0
1
2
3
4
5
6
8
9

数据范围与提示

对于全部数据,1n2×10^5。

_____________________________________________________________________________________________________________

树形动态规划,典型的求最长链,变化就是加了一个求链上的点。

写的过程中没有注意到点的多次加入,所以错了!

_____________________________________________________________________________________________________________

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=2e5+10;
 4 int n;
 5 struct edge
 6 {
 7     int u,v,nxt;
 8 }e[maxn<<1];
 9 int head[maxn],js;
10 void addage(int u,int v)
11 {
12     e[++js].u=u;e[js].v=v;
13     e[js].nxt=head[u];head[u]=js;
14 }
15 int ml[maxn],sl[maxn];
16 int ans=0;
17 void dp(int u,int fa)
18 {
19     for(int i=head[u];i!=-1;i=e[i].nxt)
20     {
21         int v=e[i].v;
22         if(v!=fa)
23         {
24             dp(v,u);
25             if(ml[v]+1>ml[u])
26             {
27                 sl[u]=ml[u];
28                 ml[u]=ml[v]+1;
29             }
30             else if(ml[v]+1>sl[u])
31                 sl[u]=ml[v]+1;
32         }
33     }
34     if(ml[u]+sl[u]>ans)ans=ml[u]+sl[u];
35 }
36 int q[maxn],jss,bz[maxn];
37 void work(int u,int fa,int len)
38 {
39     if(bz[u]==0)
40     {
41         q[jss++]=u;
42         bz[u]=1;
43     }
44     for(int i=head[u];i!=-1;i=e[i].nxt)
45     {
46         int v=e[i].v;
47         if(v!=fa)
48         {
49             if(ml[v]==len-1)work(v,u,len-1);
50         }
51     }
52 }
53 void dfs(int u,int fa)
54 {
55     if(ml[u]+sl[u]==ans)
56     {
57         if(ml[u]!=sl[u])work(u,fa,ml[u]);
58         work(u,fa,sl[u]);
59     }
60     for(int i=head[u];i!=-1;i=e[i].nxt)
61     {
62         int v=e[i].v;
63         if(v!=fa)dfs(v,u);
64     }
65 }
66 int main()
67 {
68     scanf("%d",&n);
69     memset(head,-1,sizeof(head));
70     for(int u,v,i=1;i<n;++i)
71     {
72         scanf("%d%d",&u,&v);
73         addage(u,v);addage(v,u);
74     }
75     dp(0,-1);
76     dfs(0,-1);
77     sort(q,q+jss);
78     for(int i=0;i<jss;++i)printf("%d
",q[i]);
79     return 0;
80 }
原文地址:https://www.cnblogs.com/gryzy/p/10152590.html