2019牛客多校第四场A meeting 思维

meeting

题意

一个树上有若干点上有人,找出一个集合点,使得所有人都到达这个点的时间最短(无碰撞)

思路

就是找树的直径,找直径的时候记得要找有人的点

#include<bits/stdc++.h>
#include<vector>
#include<algorithm>
using namespace std;
#define pb push_back
#define F first
#define S second
#define mkp make_pair
const int maxn=1e5+5;
typedef long long ll;
const int inf=1e10;
int n,k,id,x,y,vis[maxn],head[maxn];
struct Node{
    int to,next;
}edge[maxn*4];
int cnt=0;
void add(int x,int y){
    edge[cnt].to=y;
    edge[cnt].next=head[x];
    head[x]=cnt++;
}
int a[maxn];
int now=0;
void  dfs(int x,int fa,int dep){
    if(dep>now&&vis[x]){
        now=dep;
        id=x;
    }
    for(int i=head[x];i!=-1;i=edge[i].next){
        int y=edge[i].to;
        if(y!=fa)dfs(y,x,dep+1);
    }
}
int main(){
    scanf("%d%d",&n,&k);
    for(int i=1;i<=n;i++)head[i]=-1;
    for(int i=1;i<n;i++){
        scanf("%d%d",&x,&y);
        add(x,y);
        add(y,x);
    }
    for(int i=1;i<=k;i++)
    scanf("%d",&a[i]),vis[a[i]]=1;
    dfs(1,0,0);
    now=0;
    dfs(id,0,0);
    printf("%d\n",(now+1)/2);
 
    return 0;
}
posted @ 2019-08-22 18:21  tttttttttrx  阅读(137)  评论(0编辑  收藏  举报