题解:
题意比较绕,写出模型
街是边,路口是点,
自环在DFS里无所谓(重边也无所谓)
然后显然是个欧拉回路 ,(走过所有边回到起点)
然后图保证联通,只要判断能不能构成欧拉回路就行了
然后发现LOJ居然没pe,pe是直接wa,难受啊马飞
#include<bits/stdc++.h> #define fi first #define se second #define io std::ios::sync_with_stdio(false) using namespace std; typedef long long ll; typedef pair<int,int> pii; const int P = 1e9+7, INF = 0x3f3f3f3f; const int maxn=2000; ll gcd(ll a,ll b){return b?gcd(b,a%b):a;} ll qpow(ll a,ll n){ll r=1%P;for (a%=P; n; a=a*a%P,n>>=1)if(n&1)r=r*a%P;return r;} int _next[maxn*2],head[maxn],tot,to[maxn*2]; int id[maxn*2]; void add(int x,int y,int z) { _next[++tot]=head[x],head[x]=tot,to[tot]=y,id[tot]=z; //_next[++tot]=head[y],head[y]=tot,to[tot]=x; } int cnt; int ans[maxn]; int vis[maxn]; void dfs(int u) { for(int &i=head[u];i;i=_next[i]) { int v=to[i]; int dd=id[i]; if(!vis[dd]) { vis[dd]++; dfs(v); ans[cnt++]=dd; } } } int in[maxn]; int flag=0; int main() { int s; int num=0; int x,y,z; while(cin>>x>>y) { if(!x&&!y) { if(num==0) break; dfs(s); for(int i=1;i<=44;i++) { if(in[i]%2==1) { flag=1; break; } } if(flag) cout<<"Round trip does not exist."<<endl; else { for(int i=0;i<cnt;i++) { cout<<ans[i]; if(i!=cnt-1) cout<<' '; } cout<<endl; } for(int i=1;i<=50;i++) { head[i]=0; in[i]=0; } memset(vis,0,sizeof(vis)); cnt=0; tot=0; num=0; flag=0; continue; } cin>>z; add(x,y,z); add(y,x,z); in[x]++; in[y]++; num++; if(num==1) s=min(x,y); } }