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;
}
话说本地没有任何问题的话怎么调