旅游规划


试题描述

W 市的交通规划出现了重大问题,市政府下定决心在全市各大交通路口安排疏导员来疏导密集的车流。但由于人员不足,W 市市长决定只在最需要安排人员的路口安排人员。具体来说,W 市的交通网络十分简单,由 n 个交叉路口和 n−1 条街道构成,交叉路口路口编号依次为 0,1,?,n−1 。任意一条街道连接两个交叉路口,且任意两个交叉路口间都存在一条路径互相连接。

经过长期调查,结果显示,如果一个交叉路口位于 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

其他说明

数据范围:对于全部数据 1 <= n <= 2×100 000?? 。

看注释

#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<cstdio>
#include<cstdlib>
#include<cmath>
using namespace std;
inline int rd()
{
    int x=0,f=1;
    char ch=getchar();
    for(;!isdigit(ch);ch=getchar()) if(ch==‘-‘) f=-1;
    for(;isdigit(ch);ch=getchar()) x=x*10+ch-‘0‘;
    return x*f;
}
inline void write(int x)
{
    if(x<0) putchar(‘-‘),x=-x;
    if(x>9) write(x/10);
    putchar(x%10+‘0‘);
    return ;
}
int n;
int head[400006],to[400006],nxt[400006];//数组应定要开够!!!!!!!!!!
int total=0;
void add(int x,int y)
{
    total++;
    to[total]=y;
    nxt[total]=head[x];
    head[x]=total;
    return ;
}
int fir[400006],sec[400006];//fir[i]存的是以i为根的最长链,sec[i]是次长链
int s1[400006],s2[400006];//分别存最长连和次长链是从那个点转移的
int ans=0;//最长链长度
int dfs(int x,int la)//x是当前点,la是他的父亲节点
{
    for(int e=head[x];e;e=nxt[e])
    {
        int h=to[e];
        if(h!=la)
        {
            int d=dfs(h,x)+1;
            if(d>fir[x])
            {
                //注意在给最长链赋值时,要把原来最长链在的额支赋给次长链
                sec[x]=fir[x];
                s2[x]=s1[x];
                fir[x]=d;
                s1[x]=h;
            }
            else if(d>sec[x])
            {
                sec[x]=d;
                s2[x]=h;
            }
        }
    }
    ans=max(ans,fir[x]+sec[x]);//因为最长链和次长链从不同子树转移,所以书上最长链为两个的和
    return fir[x];
}
int g[400006];
void dp(int x,int la)
{
    if(x!=0)
    {
        /*
           玄学存
           因为fir和sec存的是由子树转移的值
           所以就忽略了一种特殊情况
           例子:
                   *
                   |
                   *
                   |
                   *
                  /                  *   *
                /                    *       *
            所以很明显,我们需要一个数组来存上面的最长链
        */
        if(x!=s1[la]) g[x]=max(fir[la]+1,g[la]+1);//不能从父亲节点直接转移,因为可能是fir,所以用到了s1和s2
        else g[x]=max(sec[la]+1,g[la]+1);
    }
    for(int e=head[x];e;e=nxt[e]) if(to[e]!=la) dp(to[e],x);
}
int main()
{
    n=rd();
    for(int i=1;i<n;i++)
    {
        int x,y;
        x=rd();
        y=rd();
        add(x,y);//双向存边,因为是无向图
        add(y,x);
    }
    dfs(0,0);//注意初值,下标从0开始
    dp(0,0);
    for(int i=0;i<n;i++) if(g[i]+fir[i]==ans||fir[i]+sec[i]==ans) printf("%d\n",i);//输出节点(调了好久QAQ)
    return 0;
}

最后喜欢的话不如来推荐,评论,关注三连。

不喜欢的话也昧着良心推荐一下吧!!!!

原文地址:https://www.cnblogs.com/WWHHTT/p/9505050.html

时间: 2024-11-08 23:11:47

旅游规划的相关文章

07-图6 旅游规划

题目: 有了一张自驾旅游路线图,你会知道城市间的高速公路长度.以及该公路要收取的过路费.现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径.如果有若干条路径都是最短的,那么需要输出最便宜的一条路径. 输入格式: 输入说明:输入数据的第1行给出4个正整数N.M.S.D,其中N(2≤N≤500)是城市的个数,顺便假设城市的编号为0~(N?1):M是高速公路的条数:S是出发地的城市编号:D是目的地的城市编号.随后的M行中,每行给出一条高速公路的信息,分别是:城市1.城市2.高速

PAT 旅游规划

旅游规划 有了一张自驾旅游路线图,你会知道城市间的高速公路长度.以及该公路要收取的过路费.现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径.如果有若干条路径都是最短的,那么需要输出最便宜的一条路径. 考察dijkstra算法   要注意的是  当权重相等时 要更新下费用 AC代码 1 #include <stdio.h> 2 #define MAX 100000 3 typedef struct 4 { 5 int weight; 6 int cost; 7 }gra

PTA 旅游规划(25 分)

7-10 旅游规划(25 分) 有了一张自驾旅游路线图,你会知道城市间的高速公路长度.以及该公路要收取的过路费.现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径.如果有若干条路径都是最短的,那么需要输出最便宜的一条路径. 输入格式: 输入说明:输入数据的第1行给出4个正整数N.M.S.D,其中N(2≤N≤500)是城市的个数,顺便假设城市的编号为0~(N?1):M是高速公路的条数:S是出发地的城市编号:D是目的地的城市编号.随后的M行中,每行给出一条高速公路的信息,分别

一本通1581旅游规划

1581:旅游规划 时间限制: 1000 ms         内存限制: 524288 KB 描述W市的交通规划出现了重大问题,市政府下决心在全市的各大交通路口安排交通疏导员来疏导密集的车流.但由于人员不足,W市市长决定只在最需要安排人员的路口安放人员.具体说来,W市的交通网络十分简单,它包括n个交叉路口和n-1条街道,任意一条街道连接两个交叉路口,并且任意两个交叉路口之间都存在一条路径互相连接.经过长期调查结果显示如果一个交叉路口位于W市交通网的最长路径上,那么这个路口必然拥挤不堪,所谓最长

如何做好农业观光旅游规划和农业休闲旅游开发?

熊大寻旅游规划公司/文 农业旅游是一种新型农业生产经营形式 ,也是一种新型旅游活动项目 ,是在发展农业生产的基础上有机地附加了生态旅游观光功能的交叉性产业 ,是当今旅游新需求的必然产物.农业生态旅游是把农业.生态和旅游业结合起来,利用田园景观.农业生产活动.农村生态环境和农业生态经营模式,吸引游客前来观赏.品尝.作习.体验.健身.科学考察.环保教育.度假.购物的一种新型的旅游开发类型.生态农业旅游是近几年才兴起的一种新型的旅游方式,人们多居住在城市里面,对于农村的概念越来越模糊.所以根据人们返璞

vijos 1476 旅游规划(csapc)

描述 W市的交通规划出现了重大问题,市政府下决心在全市的各大交通路口安排交通疏导员来疏导密集的车流.但由于人员不足,W市市长决定只在最需要安排人员的路口安放人员.具体说来,W市的交通网络十分简单,它包括n个交叉路口和n-1条街道,任意一条街道连接两个交叉路口,并且任意两个交叉路口之间都存在一条路径互相连接.经过长期调查结果显示如果一个交叉路口位于W市交通网的最长路径上,那么这个路口必然拥挤不堪,所谓最长路径定义为某条路径p=(v1,v2,v3-vk),路径经过的路口各不相同且城市中不存在长度>k

PAT 07-图6 旅游规划 (25分)

有了一张自驾旅游路线图,你会知道城市间的高速公路长度.以及该公路要收取的过路费.现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径.如果有若干条路径都是最短的,那么需要输出最便宜的一条路径. 输入格式: 输入说明:输入数据的第1行给出4个正整数NN.MM.SS.DD,其中NN(2\le N\le 5002≤N≤500)是城市的个数,顺便假设城市的编号为0~(N-1N−1):MM是高速公路的条数:SS是出发地的城市编号:DD是目的地的城市编号.随后的MM行中,每行给出一条高

07-图6 旅游规划 (25 分)

有了一张自驾旅游路线图,你会知道城市间的高速公路长度.以及该公路要收取的过路费.现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径.如果有若干条路径都是最短的,那么需要输出最便宜的一条路径. 输入格式: 输入说明:输入数据的第1行给出4个正整数N.M.S.D,其中N(2)是城市的个数,顺便假设城市的编号为0~(N?1):M是高速公路的条数:S是出发地的城市编号:D是目的地的城市编号.随后的M行中,每行给出一条高速公路的信息,分别是:城市1.城市2.高速公路长度.收费额,中

07-图6 旅游规划 (25 分)

有了一张自驾旅游路线图,你会知道城市间的高速公路长度.以及该公路要收取的过路费.现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径.如果有若干条路径都是最短的,那么需要输出最便宜的一条路径. 输入格式: 输入说明:输入数据的第1行给出4个正整数N.M.S.D,其中N(2)是城市的个数,顺便假设城市的编号为0~(N−1):M是高速公路的条数:S是出发地的城市编号:D是目的地的城市编号.随后的M行中,每行给出一条高速公路的信息,分别是:城市1.城市2.高速公路长度.收费额,中