萌新求调小号悬2关
查看原帖
萌新求调小号悬2关
576817
Lyrella楼主2024/12/21 20:43

思路应该没问题,调了很久没有过,破防,求调。

#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll rd(){
   ll x = 0, f = 1; char c = getchar();
   while(! isdigit(c)){if(c == '-')f = - f; c = getchar();}
   while(isdigit(c)){x = (x << 3) + (x << 1) + (c ^ 48); c = getchar();}
   return x * f;
}

const int N = 1e5 + 5;
int n, m, hd[N], cnt;
int low[N], fa[N], dep[N];
int pos[N][2];
bitset < N > vs;
bool o;
struct edge{
    int nxt, to;
}e[N << 1];
void add(int u, int v){
    e[++cnt] = {hd[u], v}, hd[u] = cnt;
}
void umin(int &x, int y){x = (dep[x] < dep[y] ? x : y);}

void tar(int u, int f){
    vs.set(u); low[u] = u; dep[u] = dep[fa[u] = f] + 1;
    for(int i = hd[u]; i; i = e[i].nxt){
        int v = e[i].to;
        if(! vs[v])tar(v, u), umin(low[u], low[v]);
        else umin(low[u], v);
    }
}

int path[3][N], c[3];

void clr(){
    cnt = o = 0;
    for(int i = 1; i <= n; ++i)vs.reset(i);
    for(int i = 1; i <= n; ++i)
        hd[i] = low[i] = 0,
        pos[i][0] = pos[i][1] = 0;
    for(int i = 0; i < 3; ++i)c[i] = 0;
}

void get(int s, int t, int cur){
    int u = pos[s][cur - 1];
    c[cur] = dep[u] - dep[s] + 1;
    for(int i = c[cur], v = u; i; --i, v = fa[v])path[cur][i] = v;
    path[cur][++c[cur]] = u = low[u];
    int k = dep[t] - dep[u];
    for(int i = 0; i < k; ++i, t = fa[t])path[cur][c[cur] + k - i] = t;
    c[cur] += k;
}
void out(){
    for(int i = 0; i < 3; ++i, puts("")){
        printf("%d", c[i]);
        for(int j = 1; j <= c[i]; ++j)printf(" %d", path[i][j]);
    }
}

void dfs(int u, int f){
    if(o)return; vs.set(u); pos[u][0] = u;
    for(int i = hd[u]; i; i = e[i].nxt){
        int v = e[i].to; if(vs[v])continue;
        dfs(v, u); if(o)return;
        if(! pos[u][1]){
            pos[u][1] = pos[v][0];
            if(dep[low[pos[u][0]]] > dep[low[pos[u][1]]])swap(pos[u][0], pos[u][1]);
        }
        else if(dep[low[pos[u][0]]] > dep[low[pos[v][0]]])pos[u][1] = pos[u][0], pos[u][0] = pos[v][0];
        else if(dep[low[pos[u][1]]] > dep[low[pos[v][0]]])pos[u][1] = pos[v][0];
    }
    if(dep[low[pos[u][1]]] < dep[u]){
        // printf("nb! %d \n", u);
        printf("%d %d\n", u, low[pos[u][1]]);
        path[0][c[0] = 1] = u;
        for(int i = u; i ^ low[pos[u][1]]; i = fa[i], path[0][++c[0]] = i);
        get(u, low[pos[u][1]], 1), get(u, low[pos[u][1]], 2);
        out();
        return o = true, void();
    }
}

signed main(){
    int T = rd();
    while(T--){
        n = rd(); m = rd(); clr(); dep[0] = 0;
        for(int i = 1, u, v; i <= m; ++i)u = rd(), v = rd(), add(u, v), add(v, u);
        for(int i = 1; i <= n; ++i)if(! vs[i])tar(i, 0); dep[0] = N;
        for(int i = 1; i <= n; ++i)vs.reset(i);
        for(int i = 1; i <= n and o == 0; ++i)if(! vs[i])dfs(i, 0);
        if(! o)puts("-1");
    }
    return 0;
}
2024/12/21 20:43
加载中...