P5022 [NOIP2018 提高组] 旅行

::: 主程序要简洁 有些变量 可以放在 子程序
:::双向边-> faa 有环-> vis or TLE
:::顺序不可以错 cnt<n 一定 有误 因为是基环树 所以可能 删去了 数枝边
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<bits/stdc++.h> #define ll long long #define ddd printf("-----------------debug\n"); using namespace std; const int maxn=5e3+10; vector<int> a[maxn]; int ans[maxn],cnt,vis[maxn],n,m,frr[maxn],too[maxn],res[maxn]; void dfs1(int x,int faa) { //vis[x]=1; for(int i=0;i<a[x].size();i++) { int v=a[x][i];if(v==faa) continue; ans[++cnt]=v; dfs1(v,x); } } void dfs2(int x,int faa,int from,int to) { if(vis[x]) return; vis[x]=1; res[++cnt]=x; for(int i=0;i<a[x].size();i++) { int v=a[x][i];if(v==faa) continue; if((x==from&&v==to)||(x==to&&v==from)) continue; // res[++cnt]=v;vis[v]=1; dfs2(v,x,from,to); } } /* bool ok(int res[],int ans[]){ for(int i=1;i<=n;i++){ if(res[i]<ans[i]) return 1; else return 0; } // return 0; }*/ /////!!!!!!! int ok(int res[],int ans[]) { for(int i=1;i<=n;i++) { if(res[i]<ans[i]) return 1; else if(res[i]>ans[i]) return 0; } return 0; } void update(){ for(int i=1;i<=n;i++) ans[i]=res[i]; } int main() { ios::sync_with_stdio(false); cin.tie(0); cin>>n>>m; for(int i=1;i<=m;i++){ int u,v;cin>>u>>v; a[u].push_back(v); a[v].push_back(u); frr[i]=u,too[i]=v; } for(int i=1;i<=n;i++) sort(a[i].begin(),a[i].end()); if(m==n-1){ ans[++cnt]=1; dfs1(1,1); for(int i=1;i<=n;i++) cout<<ans[i]<<" "; cout<<endl; return 0; } else{ int flag=1; for(int i=1;i<=m;i++) {// 主程序要简洁 有些变量 可以放在 子程序 memset(vis,0,sizeof(vis)); cnt=0;//双向边-> faa 有环-> vis orTLE dfs2(1,1,frr[i],too[i]); if(cnt<n) continue ;//顺序不可以错 cnt<n 一定 有误 因为可能 删去了 数枝边 if(flag) update(),flag=0; if(ok(res,ans)) update(); } for(int i=1;i<=n;i++) { printf("%d ",ans[i]); } } return 0; }

浙公网安备 33010602011771号