求助 #23 本地AC结果RE
查看原帖
求助 #23 本地AC结果RE
145994
耶梦加得楼主2022/3/17 06:55

RT,RE on #23, #25, WA on #24,把判环去掉反而过了……会是什么原因呢?

代码如下:

#include<algorithm>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
#include<vector>
using namespace std;
int n, m;
vector<int> g[5007];
bool f[5007][5007];
bool vis[5007], flag, com;
int now[5007], cnt = 0;
int ans[5007];
void dfs(int x) {
    now[++cnt] = x;
    if(com && now[cnt] > ans[cnt]) {
        flag = true; return;
    }
    if(now[cnt] < ans[cnt]) com = false;
    vis[x] = true;
    for(int i = 0; i < g[x].size(); ++i) {
        int to = g[x][i];
        if(vis[to] || f[x][to]) continue;
        dfs(to);
        if(flag) return;
    }
}
int stk[5007], top;
bool ins[5007], onr[5007];
void ring(int x, int f) {
    stk[++top] = x; ins[x] = true;
    vis[x] = true;
    for(int i = 0; i < g[x].size(); ++i) {
        int to = g[x][i];
        if(!vis[to]) ring(to, x);
        else if(to != f && ins[to]) {
            do {
                onr[stk[top]] = true;
                ins[stk[top]] = false;
            }while(stk[top--] != to);
        }
    }
    --top; ins[x] = false;
}
signed main() {
    scanf("%d %d", &n, &m);
    for(int i = 1; i <= m; ++i) {
        int u, v; scanf("%d %d", &u, &v);
        g[u].push_back(v);
        g[v].push_back(u);
    }
    for(int i = 1; i <= n; ++i) sort(g[i].begin(), g[i].end());
    memset(ans, 0x3f, sizeof(ans));
    if(m == n - 1) {
        dfs(1);
        for(int i = 1; i <= n; ++i) printf("%d ", now[i]);
        putchar('\n');
        return 0;
    }
    ring(1, 0);
    for(int i = 1; i <= n; ++i) {
        if(!onr[i]) continue;
        for(int j = 0; j < g[i].size(); ++j) {
            int to = g[i][j];
            if(to > i) break;
            if(onr[to]) {
                f[i][to] = f[to][i] = true;
                memset(vis, false, sizeof(vis));
                flag = false; com = true;
                cnt = 0;
                dfs(1);
                if(!flag && cnt == n) {
                    for(int k = 1; k <= n; ++k) ans[k] = now[k];
                }
                f[i][to] = f[to][i] = false;
            }
        }
    }
    for(int i = 1; i <= n; ++i) printf("%d ", ans[i]);
    putchar('\n');
    return 0;
}

话说本地没有任何问题的话怎么调

2022/3/17 06:55
加载中...