dfs找欧拉回路
#include<bits/stdc++.h> using namespace std; const int N=2e5+10,M=2e5+10; int h[N],e[M*2],ne[M*2],idx; int n,m; int t; int dout[N]; int din[N]; bool vis[M*2]; int p[M*2]; int cnt=0; void add(int a,int b) { e[idx]=b,ne[idx]=h[a],h[a]=idx++; } void dfs(int u) { for(int &i=h[u];i;i=ne[i]) { if(vis[i]) continue; vis[i]=true; if(t==1) vis[i^1]=true; int no; if(t==1) { if((i&1)) { no=-(i/2); }else no=i/2; }else { no=i-1; } int j=e[i]; dfs(j); p[++cnt]=no; } } int main() { scanf("%d",&t); scanf("%d%d",&n,&m); idx=2; for(int i=1;i<=m;i++) { int a,b; scanf("%d%d",&a,&b); add(a,b); dout[a]++; din[b]++; if(t==1) add(b,a); } if(t==1) { for(int i=1;i<=n;i++) { if((din[i]+dout[i])%2!=0) { cout<<"NO"<<endl; return 0; } } }else { for(int i=1;i<=n;i++) { if(din[i]!=dout[i]) { cout<<"NO"<<endl; return 0; } } } for(int i=1;i<=n;i++) { if(h[i]) { dfs(i); break; } } if(cnt!=m) { cout<<"NO"<<endl; return 0; } cout<<"YES"<<endl; for(int i=cnt;i>=1;i--) { cout<<p[i]<<' '; } cout<<endl; }
#include<bits/stdc++.h> using namespace std; const int N=510,M=2000; int g[N][N]; int m; int d[N]; int ans[M]; int cnt; void dfs(int u) { for(int i=1;i<=500;i++) { if(g[u][i]) { g[u][i]--,g[i][u]--; dfs(i); } } ans[++cnt]=u; } int main() { scanf("%d",&m); for(int i=1;i<=m;i++) { int a,b; scanf("%d%d",&a,&b); g[a][b]++; g[b][a]++; d[a]++; d[b]++; } int start=1; for(int i=1;i<=500;i++) { if(d[i]%2) { start=i; break; } } dfs(start); for(int i=cnt;i;i--) { printf("%d\n",ans[i]); } }
#include <bits/stdc++.h> using namespace std; #define x first #define y second # define rep(i,be,en) for(int i=be;i<=en;i++) # define pre(i,be,en) for(int i=be;i>=en;i--) #define ll long long #define endl "\n" #define LOCAL #define pb push_back typedef pair<ll, ll> PII; #define eb emplace_back #define sp(i) setprecision(i) const int N = 1e5 + 10, INF = 0x3f3f3f3f; int din[N]; int dout[N]; vector<int>g[N]; int n,m; int ans[N*2]; int del[N]; int cnt=0; stack<int>s; void dfs(int u) { for(int i=del[u];i<g[u].size();i=del[u]) { del[u]=i+1; dfs(g[u][i]); } //s.push(u); ans[++cnt]=u; } void solve() { scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { int a,b; scanf("%d%d",&a,&b); g[a].push_back(b); din[b]++; dout[a]++; } for(int i=1;i<=n;i++) sort(g[i].begin(),g[i].end()); int start=1; int f1=0; int f2=0; int sum=0; for(int i=1;i<=n;i++) { if(dout[i]!=din[i]) { sum++; if(dout[i]==din[i]+1) { f2++; }else if(dout[i]+1==din[i]) { f1++; } } } if(!(sum==0||(sum==2&&f1==1&&f2==1))) { printf("No\n"); return; } for(int i=1;i<=n;i++) { if(din[i]+1==dout[i]) { start=i; break; } } dfs(start); for(int i=cnt;i>=1;i--) { printf("%d ",ans[i]); } // while(s.size()) // { // cout<<s.top()<<' '; // s.pop(); // } puts(""); } signed main() { // std::ios::sync_with_stdio(false); // std::cin.tie(nullptr); //#ifdef LOCAL //freopen("data.in.txt","r",stdin); //freopen("data.out.txt","w",stdout); //#endif int __ = 1; //cin>>__; while (__--) { solve(); } return 0; }