好吧。。。一直咕。。现在才过。。。被卡常卡到爆。。。
写的垃圾版本,$n^2$无脑删边。。可以发现走出来的是棵树。。。更优秀的及数据加强版先咕着。。。一定写。qwq
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<vector> #define ll long long #define R register int static char B[1<<15],*S=B,*D=B; #define getchar() (S==D&&(D=(S=B)+fread(B,1,1<<15,stdin),S==D)?EOF:*S++) using namespace std; inline int g() { R ret=0,fix=1; register char ch; while(!isdigit(ch=getchar())) fix=ch=='-'?-1:fix; do ret=ret*10+(ch^48); while(isdigit(ch=getchar())); return ret*fix; } int n,m,tot; int ans[5010]; bool vis[5010],used[5010][5010]; int w[5001][5001]; inline void dfs1(int u) { vis[u]=true; ans[++tot]=u; for(R i=1,lim=w[u][0];i<=lim;++i) { R v=w[u][i]; if(!vis[v]) dfs1(v); } } int s[5010]; int U,V; pair<int,int> e[5010]; inline void dfs2(int u) { vis[u]=true; s[++tot]=u; for(R i=1,lim=w[u][0];i<=lim;++i) { R v=w[u][i]; if((u==U&&v==V)||(u==V&&v==U)) continue; if(!vis[v]) dfs2(v); } } inline bool ck() {for(R i=1;i<=n;++i) if(s[i]!=ans[i]) return ans[i]>s[i]; return false;} signed main() { n=g(),m=g(); for(R i=1,u,v;i<=m;++i) u=g(),v=g(),w[u][++w[u][0]]=v,w[v][++w[v][0]]=u,e[i]=make_pair(u,v); for(R i=1;i<=n;++i) sort(w[i]+1,w[i]+w[i][0]+1); if(m==n-1) { dfs1(1); for(R i=1;i<=n;++i) printf("%d ",ans[i]); } else { for(R i=1;i<=n;++i) ans[i]=n-i+1; for(R i=1;i<=m;++i) { tot=0; memset(vis,0,sizeof(vis)); U=e[i].first,V=e[i].second; dfs2(1); if(tot==n&&ck()) memcpy(ans,s,sizeof(s)); } for(R i=1;i<=n;++i) printf("%d ",ans[i]); } }
2019.06.04