CodeForces Round #196 D Book of Evil

来源:互联网 发布:怎么在淘宝上买电视棒 编辑:程序博客网 时间:2024/05/20 21:20

这个题感觉叉姐讲的灰常好,我就不献丑了

偷偷放上链接


具体代码就是两遍DFS

感觉也没什么好讲的样子?


那就看代码吧恩(点头)


-------------------------我是代码的昏割线-------------------

#include<bits/stdc++.h>using namespace std;const int maxn = 112345;vector<int> edge[maxn];void init(int n){    for(int i=0;i<=n;i++)        edge[i].resize(0);}void Link(int st,int ed){    edge[st].push_back(ed);    edge[ed].push_back(st);}bool newt[maxn];bool vis[maxn];bool dfsg(int st){    vis[st]=true;    for(auto &x:edge[st]){        if(vis[x]==false){            vis[x]=true;            if(dfsg(x)){                newt[st]=true;            }        }    }    return newt[st];}int dis[maxn];void dfsnd(int st,int d){    dis[st]=d;    for(auto &x:edge[st]){        if(newt[x]==true && dis[x]==-1){            dfsnd(x,d+1);        }    }}int disa[maxn];int disb[maxn];void dfs(int st,int d,int *dis){    dis[st]=d;    for(auto & x : edge[st]){        if(dis[x]==-1)            dfs(x,d+1,dis);    }}int main(){    int n,m,d;    while(~scanf("%d %d %d",&n,&m,&d)){        memset(newt,0,sizeof(newt));        init(n);        int st;        while(m--){            scanf("%d",&st);            newt[st]=true;        }        int u,v;        for(int i=1;i<n;i++){            scanf("%d %d",&u,&v);            Link(u,v);        }        memset(vis,0,sizeof(vis));        dfsg(st);        memset(dis,-1,sizeof(dis));        dfsnd(st,0);        int sta = st;        for(int i=1;i<=n;i++){            if(dis[i] > dis[sta])                sta = i;        }        memset(dis,-1,sizeof(dis));        dfsnd(sta,0);        int stb = sta;        for(int i=1;i<=n;i++){            if(dis[i] > dis[stb])                stb = i;        }        memset(disa,-1,sizeof(disa));        memset(disb,-1,sizeof(disb));        dfs(sta,0,disa);        dfs(stb,0,disb);        int ans=0;        for(int i=1;i<=n;i++){            if(max(disa[i],disb[i]) <=d)                ans++;        }        printf("%d\n",ans);    }    return 0;}


0 0
原创粉丝点击