求助,全re
查看原帖
求助,全re
435689
sillage丶楼主2021/9/28 19:59

rt找了好久找不出哪里出问题了。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <numeric>
#include <algorithm>
#include <functional>
#include <map>
#include <queue>
#include <vector>
#include <utility>

#define ed end()
#define bg begin()
#define next first 
#define wei second
#define mp make_pair
#define pb push_back
#define all(x) x.bg, x.ed
#define newline puts("")
#define si(x) ((int)x.size())
#define rep(i, n) for(register int i = 1; i <= n; ++i)
#define rrep(i, n) for(register int i = 0; i < n; ++i)
#define srep(i, s, t) for(register int i = s; i <= t; ++i)
#define drep(i, s, t) for(register int i = t; i >= s; --i)

using namespace std;

typedef long long ll;
typedef pair<int, int> pii;

const int MAXN = 1e6 + 10;
const int MAXM = 3e6 + 10;
const int INF = 0x3f3f3f3f;
const ll INF_ll = 1ll * INF * INF;
const int MOD = 1e9 + 7;
const double eps = 1e-7;

int n, m, cnt;

struct edges{
    int from, to, w;
} edge[MAXM];

vector<pii> vec[MAXN];
int fa[MAXN];
int f[MAXN][21], d[MAXN][21];
int dep[MAXN];

inline bool cmp(const edges&lhs, const edges&rhs){
    return lhs.w < rhs.w;
}

inline int r(){
    char c = getchar();int x = 0,fh = 0;
    while(c < '0' || c > '9'){fh |= c == '-';c = getchar();}
    while(c >= '0' && c <= '9'){x = (x << 1) + (x << 3) + (c ^ 48);c = getchar();}
    return fh ? -x : x;
}

void print(int x){
    if( x < 0 )  x = -x;
    if( x >= 10 ) print(x/10);
    putchar(x%10+'0');
}

inline int find(int x){
    return fa[x] == x ? x : fa[x] = find(fa[x]);
}

void kruskal(){
    rep(i, n) fa[i] = i;
    sort(edge + 1, edge + 1 + m, cmp);
    rep(i, m){
        int x = edge[i].from, y = edge[i].to, w = edge[i].w;
        int fx = find(x), fy = find(y);
        if(fx == fy) continue;
        vec[fx].pb(mp(fy, w)), vec[fy].pb(mp(fx, w));
        fa[fx] = fy;
        cnt++;
        if(cnt == n - 1) break;
    }
}

void dfs(int p, int ff, int len){
    dep[p] = dep[ff] + 1;
    f[p][0] = ff, d[p][0] = len;
    for(register int i = 1; (1 << i) <= dep[p]; ++i){
        f[p][i] = f[f[p][i - 1]][i - 1];
        d[p][i] = max(d[p][i - 1], d[d[p][i - 1]][i - 1]);
    }
    int si = si(vec[p]);
    rrep(i, si){
        if(vec[p][i].next == ff) continue;
        dfs(vec[p][i].next, p, vec[p][i].wei);
    }
}

void swap(int&x, int&y){
    x ^= y;
    y ^= x;
    x ^= y;
}

int lca(int x, int y){
    int ret = -INF;
    if(dep[x] > dep[y]) swap(x, y);
    drep(i, 0, 20){
        if(dep[x] + (1 << i) <= dep[y]) ret = max(ret, d[y][i]), y = f[y][i];
    }
    if(x == y) return ret;
    drep(i, 0, 20){
        if(f[x][i] == f[y][i]) continue;
        ret = max(d[y][i], max(d[x][i], ret));
        x = f[x][i];
        y = f[y][i];
    }
    return max(max(ret, d[x][0]), d[y][0]);
}

int main(){
    // ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    n = r(), m = r();
    rep(i ,m) edge[i].from = r(), edge[i].to = r(), edge[i].w = r();
    kruskal();
    dfs(1, 0, 0);
    int q = r();
    rep(i, q){
        int x = r(), y = r();
        int fx = find(x), fy = find(y);
        if(fx != fy) printf("impossible\n");
        else printf("%d\n", lca(x, y));
    }
    return 0;
}
2021/9/28 19:59
加载中...