zoukankan      html  css  js  c++  java
  • tarjan-LCA模板

    洛谷P3379

     1 #include <cstdio>
     2 
     3 using namespace std;
     4 
     5 const int max_n=5000050;
     6 
     7 struct etype{
     8     int t,next;
     9 };
    10 struct qtype{
    11     int t,next,id;
    12 };
    13 
    14 etype e[2*max_n];
    15 qtype q[2*max_n];
    16 int a[max_n],b[max_n],ans[max_n],fa[max_n];
    17 bool vis[max_n];
    18 int cnt;
    19 
    20 void addedge(int u,int v)
    21 {
    22     cnt++;
    23     e[cnt].t=v;e[cnt].next=a[u];a[u]=cnt;
    24 }
    25 
    26 void addquery(int i,int u,int v)
    27 {
    28     cnt++;
    29     q[cnt].t=v;q[cnt].id=i;q[cnt].next=b[u];b[u]=cnt;
    30 }
    31 
    32 int findfather(int k)
    33 {
    34     if (fa[k]==k) return k;
    35     fa[k]=findfather(fa[k]);
    36     return fa[k];
    37 }
    38 
    39 void dfs(int k)
    40 {
    41     fa[k]=k;vis[k]=true;
    42     int i=b[k];
    43     while (i>0)
    44     {
    45         if (vis[q[i].t])
    46         {
    47             if (ans[q[i].id]==0) ans[q[i].id]=findfather(q[i].t);
    48         }
    49         i=q[i].next;
    50     }
    51     i=a[k];
    52     while (i>0)
    53     {
    54         if (!vis[e[i].t])
    55         {
    56             dfs(e[i].t);
    57             fa[e[i].t]=k;
    58         }
    59         i=e[i].next;
    60     }
    61 }
    62 int main()
    63 {
    64     int n,m,s;
    65     scanf("%d%d%d",&n,&m,&s);
    66     for (int i=1;i<=n;i++) a[i]=0;
    67     cnt=0;
    68     for (int i=1;i<n;i++)
    69     {
    70         int x,y;
    71         scanf("%d%d",&x,&y);
    72         addedge(x,y);addedge(y,x);
    73     }
    74     for (int i=1;i<=n;i++) b[i]=0;
    75     cnt=0;
    76     for (int i=1;i<=m;i++)
    77     {
    78         int x,y;
    79         scanf("%d%d",&x,&y);
    80         addquery(i,x,y);addquery(i,y,x);
    81     }
    82     for (int i=1;i<=n;i++) vis[i]=false;
    83     for (int i=1;i<=m;i++) ans[i]=0;
    84     dfs(s);
    85     for (int i=1;i<=m;i++) printf("%d
    ",ans[i]);
    86     return 0;
    87 }
  • 相关阅读:
    .NET内存管理、垃圾回收
    C#容器类,性能介绍
    与LINQ有关的语言特性
    IMEI
    IMSI
    无源码调试smali
    IDA远程调试 在内存中dump Dex文件
    error C4996: 'scanf': This function or variable may be unsafe.
    vue 用axios实现调用接口下载excel
    读《JavaScript权威指南》笔记(三)--对象
  • 原文地址:https://www.cnblogs.com/Currier/p/11537698.html
Copyright © 2011-2022 走看看