LCA-Tarjan(模版)

#include <iostream>
#include <string.h>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <stdio.h>
#include <deque>

using namespace std;

#define ll long long
#define ull unsigned long long
#define INF 0x3f3f3f3f
#define maxn 100005
#define eps 0.00000001
#define PI acos(-1.0)
#define M 1000000007

struct Edge{
    int v, nxt, w;
}edge[maxn], qedge[maxn];

int head[maxn], tot, qhead[maxn], qtot;
int f[maxn];
bool vis[maxn];

void init() {
    tot = 0; qtot = 0;
    memset(qhead, -1, sizeof(qhead));
    memset(head, -1, sizeof(head));
    memset(vis, 0, sizeof(vis));
}

void addEdge(int u, int v, int w){
    edge[tot].v = v;
    edge[tot].nxt = head[u];
    head[u] = tot ++;

    edge[tot].v = u;
    edge[tot].nxt = head[v];
    head[v] = tot ++;
}

void qaddEdge(int u, int v) {
    qedge[qtot].v = v;
    qedge[qtot].nxt = qhead[u];
    qhead[u] = qtot ++;

    qedge[qtot].v = u;
    qedge[qtot].nxt = qhead[v];
    qhead[v] = qtot ++;
}

int Find(int x) {
    int r = x;
    while(r != f[r])
        r = f[r];
    return r;
}

void Tarjan(int u) {
    f[u] = u;
    vis[u] = 1;
    for (int i = head[u]; i + 1; i = edge[i].nxt) {
        int son = edge[i].v;
        if(!vis[son]) {
            Tarjan(son);
            f[son] = u;
        }
    }
    for (int i = qhead[u]; i + 1; i = qedge[i].nxt) {
        int fri = qedge[i].v;
        if(vis[fri]) {
            qedge[i].w = Find(fri);
            qedge[i ^ 1].w = qedge[i].w;
        }
    }
}


int main(int argc, const char * argv[]) {
    int T;
    scanf("%d", &T);
    while(T --) {
        init();
        int n, q;
        scanf("%d %d", &n, &q);
        for (int i = 1; i < n; i ++) {
            int u, v;
            scanf("%d %d %d", &u, &v);
            addEdge(u, v);
        }
        for (int i = 0; i < q; i ++) {
            int u, v;
            scanf("%d %d", &u, &v);
            qaddEdge(u, v);
        }
        Tarjan(1);
        for(int i = 0; i < 2*q; i += 2) 
            printf("%d\n", edge[i].w);
    }


    return 0;
}

猜你喜欢

转载自blog.csdn.net/henu_jizhideqingwa/article/details/82592597