czl蒟蒻的模板库4——Tarjan

来源:互联网 发布:樱井知香作品在线播放 编辑:程序博客网 时间:2024/06/07 01:57
#include <bits/stdc++.h>using namespace std;const int maxn=500005;typedef long long ll;int n,m,s;int f[maxn];bool vis[maxn];int q1[maxn],q2[maxn];int ans[maxn];vector<int >e[maxn];inline void read(int &x) {    x=0;int f=1;char ch=getchar();    while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}    while(isdigit(ch))x=x*10+ch-'0',ch=getchar();    x*=f;}inline void read(ll &x) {    x=0;int f=1;char ch=getchar();    while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}    while(isdigit(ch))x=((x*10)+ch-'0'),ch=getchar();    x*=f;}void init(){    for(int i=1;i<=n;i++)    {        f[i]=i;        vis[i]=0;    }}int find(int now,int tra){//  printf("now:%d\n",now);    if(f[now]==now)return now;    else if(f[now]==tra)return tra;    return f[now]=find(f[now],tra);}void DFS(int now,int fa){    for(int i=0;i<(int)e[now].size();i++)    {        int u=e[now][i];        if(fa==u)continue;        else         {            DFS(u,now);        }    }    f[now]=fa;    vis[now]=1;    for(int i=1;i<=m;i++)    {        if(q1[i]==now)        {            if(vis[q2[i]])            {                ans[i]=find(q2[i],now);//              printf("%d\n",ans[i]);            }        }        else if(q2[i]==now)        {            if(vis[q1[i]])            {                ans[i]=find(q1[i],now);//              printf("%d\n",ans[i]);            }        }    }    return ;}int main(){    read(n);    read(m);    read(s);    init();    for(int i=1;i<=n-1;i++)    {        int f,t;        read(f);        read(t);        e[f].push_back(t);        e[t].push_back(f);    }    for(int i=1;i<=m;i++)    {        read(q1[i]);        read(q2[i]);    }    DFS(s,s);    for(int i=1;i<=m;i++)    {        printf("%d\n",ans[i]);    }    return 0;}
原创粉丝点击