search函数,没加前反而过了,感觉写炸了,但查不出来(
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int MAXN=5005;
int n, m, x, y, uu, vv, dis, cnt, c[MAXN], d[MAXN], f[MAXN], dad[MAXN], e[MAXN][3], a[MAXN][MAXN];
bool ft, vis[MAXN];
void dfs1(int u)
{
for(int i=1; i<=c[u]; i++)
{
int v=a[u][i];
if(vis[v]) continue;
vis[v]=1;
d[++cnt]=v;
dfs1(v);
}
}
void work1()
{
vis[1]=1;
d[cnt=1]=1;
dfs1(1);
for(int i=1; i<=n; i++)
printf("%d ", d[i]);
puts("");
}
void dfs2(int u, int fa)
{
for(int i=1; i<=c[u]; i++)
{
int v=a[u][i];
if(v==fa) continue;
if(vis[v] || (u==uu && v==vv) || (u==vv && v==uu)) continue;
vis[v]=1;
f[++cnt]=v;
dfs2(v, u);
}
}
void search(int u) //找环
{
vis[u]=1;
for(int i=1; i<=c[u]; i++)
{
int v=a[u][i];
if(v==dad[u]) continue;
if(vis[v])
{
ft=1;
for(int i=v; i; i=dad[i])
{
//printf("%d %d %d\n", dis, dad[i], i);
dis++;
e[dis][1]=i, e[dis][2]=dad[i];
}
}
if(ft) return;
dad[v]=u;
search(v);
}
}
void update()
{
memcpy(d, f, sizeof(f));
}
bool check()
{
for(int i=1; i<=n; i++)
if(d[i]!=f[i]) return d[i]>f[i];
}
void work2()
{
search(1);
for(int i=1; i<=dis; i++)
{
cnt=0, uu=e[i][1], vv=e[i][2];
memset(vis, 0, sizeof(vis));
vis[1]=1;
f[cnt=1]=1;
dfs2(1, 0);
if(cnt==n && d[1]==0) update();
if(cnt<n || !check()) continue;
update();
}
for(int i=1; i<=n; i++)
printf("%d ", d[i]);
puts("");
}
int main()
{
scanf("%d%d", &n, &m);
for(int i=1; i<=m; i++)
{
scanf("%d%d", &x, &y);
a[x][++c[x]]=y;
a[y][++c[y]]=x;
}
for(int i=1; i<=n; i++)
sort(a[i]+1, a[i]+1+c[i]);
if(m==n-1) work1();
else work2();
}