标签:head ch Loj 10159 int 旅游 include d2 d1
Loj#10159.旅游规划
题目说的很明确了,问点是否在最长路径上,记录最长次长以及最长转移的位置。
怎么判断点在最长路径上,只要最长次长和向上走三者中较大的两个的和为最长路就能说明在最长路径上。
代码显然好写。
/*
Knowledge : Rubbish Algorithm
Work by :Gym_nastics
Time : O(AC)
*/
#include<cmath>
#include<queue>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int INF=0x3f3f3f3f;
const int Mod=1e9+7;
const int N=1e6+6;
int read() {
int x=0,f=0;char ch=getchar();
for(;!isdigit(ch);ch=getchar()) f|=(ch=='-');
for(;isdigit(ch);ch=getchar()) x=(x<<1)+(x<<3)+(ch&15);
return f?-x:x;
}
void print(int x) {
if(x<0) putchar('-'),x=-x;
if(x>9) print(x/10);
putchar(x%10+48);
}
int n,cnt,head[N];struct node{int v,nxt;}e[N];
void Add_edge(int u,int v){e[++cnt]=(node){v,head[u]};head[u]=cnt;}
int Max,d1[N],d2[N],c1[N];
void dfs1(int u,int fa){
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].v;
if(v==fa) continue; dfs1(v,u);
if(d1[v]+1>d1[u])d2[u]=d1[u],d1[u]=d1[v]+1,c1[u]=v;
else if(d1[v]+1>d2[u])d2[u]=d1[v]+1;
} Max=max(d1[u]+d2[u],Max);return;
}
int up[N];
void dfs2(int u,int fa){
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].v;if(v==fa) continue;
if(c1[u]^v) up[v]=max(up[u],d1[u])+1;
else up[v]=max(up[u],d2[u])+1;dfs2(v,u);
}return;
}
signed main() {
n=read();
for(int i=1;i<n;i++){
int u=read(),v=read();
Add_edge(u,v);Add_edge(v,u);
}dfs1(0,-1);dfs2(0,-1);
for(int i=0;i<n;i++){
int com[4]={0,up[i],d1[i],d2[i]};
sort(com+1,com+4);
if(com[2]+com[3]==Max) print(i),putchar('\n');
}
return 0;
}
标签:head,ch,Loj,10159,int,旅游,include,d2,d1 来源: https://www.cnblogs.com/BlackDan/p/16060563.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。