jzoj4805-[NOIP2016提高A组模拟9.28]跟踪【dfs,树】
生活随笔
收集整理的這篇文章主要介紹了
jzoj4805-[NOIP2016提高A组模拟9.28]跟踪【dfs,树】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
正題
題目大意
一棵樹一個人從sss開始,有兩個追擊者從p,qp,qp,q出發,
在3k+1s3k+1\ s3k+1?s,那個人走
在3k+2和3k+3s3k+2和3k+3\ s3k+2和3k+3?s,追擊者走。
求那個人最久多久不會被追上。
解題思路
首先計算出每個點距離兩個追擊者和那個人的距離。
然后從那個人的位置出發開始dfsdfsdfs最終被追上的位置(注意可以在一個地方等待追擊者)
然后對一個點若這個點追擊者比他更早到達那么就不能走,不然就統計答案后繼續走。
OverOverOver
codecodecode
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int N=201000; struct node{int to,next; }a[N*2]; int n,s,q,p,dis[3][N],ls[N],ans,tot; void addl(int x,int y) {a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot; } void count_dis(int x,int fa,int id) {for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(y==fa)continue;dis[id][y]=dis[id][x]+1;count_dis(y,x,id);} } void dfs(int x,int fa) {if(dis[0][x]*2>min(dis[1][x],dis[2][x]))return;int len=min(dis[1][x],dis[2][x]);ans=max(ans,(len-1)/2*3+3-len%2);for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(y==fa) continue;dfs(y,x);} } int main() {//freopen("track.in","r",stdin);//freopen("track.out","w",stdout);scanf("%d%d%d%d",&n,&s,&q,&p);for(int i=1;i<n;i++){int x,y;scanf("%d%d",&x,&y);addl(x,y);addl(y,x);}count_dis(s,s,0);count_dis(q,q,1);count_dis(p,p,2);dfs(s,s);printf("%d",ans); }總結
以上是生活随笔為你收集整理的jzoj4805-[NOIP2016提高A组模拟9.28]跟踪【dfs,树】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jzoj4804-[NOIP2016提高
- 下一篇: 欢乐纪中A组莫名其妙赛【2019.6.6