HDU 4547 lca

来源:互联网 发布:云计算ppt模板 编辑:程序博客网 时间:2024/05/23 19:11

一直只会离线的,今天学了下在线的

自己AC的4600+ms  试了下网上加了优化的2000+


#include<stdio.h>#include<vector>#include<algorithm>#include<map>#include<string.h>#include<iostream>using namespace std;const int maxn=100100;int n,m;int ind[maxn],dep[maxn],fa[maxn],vis[maxn],dis[maxn];struct node{    int v,w;};map<string,int> mp;vector<node> vec1[maxn];void init(){    for(int i=0;i<=n;i++)    vec1[i].clear();    mp.clear();    memset(ind,0,sizeof(ind));    memset(fa,0,sizeof(fa));    memset(dep,-1,sizeof(dep));    memset(dis,0,sizeof(dis));}void dfs(int u,int f,int deep){    fa[u]=f;    dep[u]=deep;    for(int i=0;i<vec1[u].size();i++)    {        int v=vec1[u][i].v;        if(v==f)        continue;        dis[v]=dis[u]+vec1[u][i].w;        dfs(v,u,deep+1);    }}int lca(int u,int v){    if(dep[u]<dep[v])    swap(u,v);    while(dep[u]!=dep[v])    u=fa[u];    while(u!=v)    {        u=fa[u];        v=fa[v];    }    return u;}int main(){    freopen("in.txt","r",stdin);    int t;    scanf("%d",&t);    while(t--)    {        init();        scanf("%d%d",&n,&m);        int i,j;        string x,y;        int k=1;        for(i=0;i<n-1;i++)        {            cin>>x>>y;            if(mp[x]==0)            mp[x]=k++;            if(mp[y]==0)            mp[y]=k++;            node tmp;            tmp.v=mp[x];            tmp.w=1;            vec1[mp[y]].push_back(tmp);            fa[mp[x]]=mp[y];            ind[mp[x]]++;        }        for(i=1;i<=n;i++)        {            if(ind[i]==0)            {               dfs(i,-1,0);            }        }        while(m--)        {            cin>>x>>y;            if(mp[x]==mp[y])            {                printf("0\n");                continue;            }            if(lca(mp[x],mp[y])==mp[x])            {                printf("1\n");                continue;            }            if(lca(mp[x],mp[y])==mp[y])            printf("%d\n",dis[mp[x]]-dis[lca(mp[x],mp[y])]);            else            printf("%d\n",dis[mp[x]]-dis[lca(mp[x],mp[y])]+1);        }    }    return 0;}


原创粉丝点击