CODE[VS] 1036商务旅行

来源:互联网 发布:好听的网络歌手歌曲 编辑:程序博客网 时间:2024/06/05 10:18
#include <iostream>#include <cstdio>#include <vector>#include <cstring>using namespace std;const int MAXN = 30000  + 10;int head[MAXN],f[MAXN],from[MAXN*2],to[MAXN*2],deep[MAXN],tt;vector<int> query[MAXN];bool vis[MAXN];int n,m,ans;int find(int x){    return f[x] == x ? x:f[x] = find(f[x]);}void addEdge(int u,int v){    from[++tt] = v,to[tt] = head[u],head[u] = tt;    from[++tt] = u,to[tt] = head[v],head[v] = tt;}void lca(int x,int d){    deep[x] = d;    for(int i = head[x]; i; i=to[i])        if(!deep[from[i]])        {            lca(from[i],d+1);            f[from[i]] = x;        }    for(int i = 0; i<(int)query[x].size(); i++)    {        int v = query[x][i];        if(vis[v])        {            int tf = find(v);            ans += deep[x] + deep[v] - deep[tf]*2;        }    }    vis[x] = true;}int main(){    while(scanf("%d",&n) !=EOF)    {        tt = 0;        int a,b;        for(int i = 1; i<=n-1; i++)        {            scanf("%d %d",&a,&b);            addEdge(a,b);        }        scanf("%d",&m);        scanf("%d",&a);        for(int i = 1; i<m; i++)        {            scanf("%d",&b);            query[a].push_back(b);            query[b].push_back(a);            a = b;        }        for(int i = 0; i<=n; i++)            f[i] = i;        memset(vis,false,sizeof(vis));        memset(deep,0,sizeof(deep));        ans = 0;        lca(1,1);        printf("%d\n",ans);    }    return 0;}

原创粉丝点击