2018-Sp11-lyk/G

从 Trac 迁移的文章

这是从旧校内 Wiki 迁移的文章,可能存在一些样式问题,您可以向 memset0 反馈。

原文章内容如下:

{{{
#include<bits/stdc++.h>
#define maxn 120000
using namespace std;
typedef pair<int, int> pii;
pii mark[maxn];
vector<pii> pG;
int depth[maxn], parent[maxn];
vector<int> ans[3];
vector<int> G[maxn];

void DFS(int u){
    //printf("%d %d\n", u, parent[u]);
    for(int v: G[u])
        if(depth[v] == 0){
            depth[v] = depth[parent[v] = u] + 1;
            DFS(v); 
        }
        else if(parent[u] != v && depth[u] > depth[v]){
            pG.push_back(pii(u, v));
        }
}

int main(){
    freopen("grand.in", "r", stdin);
    freopen("grand.out", "w", stdout);
    int T;
    scanf("%d", &T);
    for(int t = 1; t <= T; t += 1){
        int n, m;
        scanf("%d %d", &n, &m);
        fill(depth, depth + n + 1, 0);
        fill(mark, mark + n + 1, pii(0, 0));
        for_each(G, G + n + 1, [](vector<int> &v){v.clear();});
        for(int i = 0; i < m; i += 1){
            int u, v;
            scanf("%d %d", &u, &v);
            G[u].push_back(v);
            G[v].push_back(u);
        }
        int S = 0, F = 0;
        pii x, y;
        for(int i = 1; i <= n; i += 1) if(depth[i] == 0){
            pG.clear();
            depth[i] = 1;
            parent[i] = 0;
            DFS(i);
            for(pii p: pG){
                for(int u = p.first; u != p.second; u = parent[u])
                    if(mark[u] == pii(0, 0)) mark[u] = p;
                    else{
                        x = mark[u];
                        y = p;
                        if(depth[x.second] > depth[y.second]) S = x.second;
                        else S = y.second;
                        F = u;
                        break;
                    }
                if(S) break;
            }
            if(S){
                for_each(ans, ans + 3, [](vector<int> &v){v.clear();});
                for(int u = S; u != x.second; u = parent[u]) ans[0].push_back(parent[u]);
                for(int u = x.first; u != F; u = parent[u]) ans[0].push_back(u);
                for(int u = S; u != y.second; u = parent[u]) ans[1].push_back(parent[u]);
                for(int u = y.first; u != F; u = parent[u]) ans[1].push_back(u);
                for(int u = parent[F]; u != S; u = parent[u]) ans[2].push_back(u);
                reverse(ans[2].begin(), ans[2].end()); 
                printf("%d %d\n", S, F);
                for_each(ans, ans + 3, [&](vector<int> &v){
                    printf("%d %d ", (int)v.size() + 2, S);
                    for(int x: v) printf("%d ", x);
                    printf("%d\n", F);
                });
                break;
            }
        }
        if(S == 0) printf("-1\n");
    }
}
}}}
#include<bits/stdc++.h>
#define maxn 120000
using namespace std;
typedef pair<int, int> pii;
pii mark[maxn];
vector<pii> pG;
int depth[maxn], parent[maxn];
vector<int> ans[3];
vector<int> G[maxn];
void DFS(int u){
    //printf("%d %d\n", u, parent[u]);
    for(int v: G[u])
        if(depth[v] == 0){
            depth[v] = depth[parent[v] = u] + 1;
            DFS(v); 
        }
        else if(parent[u] != v && depth[u] > depth[v]){
            pG.push_back(pii(u, v));
        }
}
int main(){
    freopen("grand.in", "r", stdin);
    freopen("grand.out", "w", stdout);
    int T;
    scanf("%d", &T);
    for(int t = 1; t <= T; t += 1){
        int n, m;
        scanf("%d %d", &n, &m);
        fill(depth, depth + n + 1, 0);
        fill(mark, mark + n + 1, pii(0, 0));
        for_each(G, G + n + 1, [](vector<int> &v){v.clear();});
        for(int i = 0; i < m; i += 1){
            int u, v;
            scanf("%d %d", &u, &v);
            G[u].push_back(v);
            G[v].push_back(u);
        }
        int S = 0, F = 0;
        pii x, y;
        for(int i = 1; i <= n; i += 1) if(depth[i] == 0){
            pG.clear();
            depth[i] = 1;
            parent[i] = 0;
            DFS(i);
            for(pii p: pG){
                for(int u = p.first; u != p.second; u = parent[u])
                    if(mark[u] == pii(0, 0)) mark[u] = p;
                    else{
                        x = mark[u];
                        y = p;
                        if(depth[x.second] > depth[y.second]) S = x.second;
                        else S = y.second;
                        F = u;
                        break;
                    }
                if(S) break;
            }
            if(S){
                for_each(ans, ans + 3, [](vector<int> &v){v.clear();});
                for(int u = S; u != x.second; u = parent[u]) ans[0].push_back(parent[u]);
                for(int u = x.first; u != F; u = parent[u]) ans[0].push_back(u);
                for(int u = S; u != y.second; u = parent[u]) ans[1].push_back(parent[u]);
                for(int u = y.first; u != F; u = parent[u]) ans[1].push_back(u);
                for(int u = parent[F]; u != S; u = parent[u]) ans[2].push_back(u);
                reverse(ans[2].begin(), ans[2].end()); 
                printf("%d %d\n", S, F);
                for_each(ans, ans + 3, [&](vector<int> &v){
                    printf("%d %d ", (int)v.size() + 2, S);
                    for(int x: v) printf("%d ", x);
                    printf("%d\n", F);
                });
                break;
            }
        }
        if(S == 0) printf("-1\n");
    }
}