日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

jzoj4805-[NOIP2016提高A组模拟9.28]跟踪【dfs,树】

發布時間:2023/12/3 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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+23k+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,树】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。