题意:
分析
非常简单的欧拉路板题
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<stack>
#define SF scanf
#define PF printf
#define MAXN 200010
using namespace std;
int t,n,m;
vector<int> a[MAXN],id[MAXN],st;
bool vis[MAXN];
int u,v,sta;
int ind[MAXN],oud[MAXN];
stack<int> s;
void dfs(int x){
for(int i=0;i<int(a[x].size());i++)
if(vis[abs(id[x][i])]==0){
vis[abs(id[x][i])]=1;
dfs(a[x][i]);
s.push(id[x][i]);
}
}
int main(){
freopen("merge.in","r",stdin);
freopen("merge.out","w",stdout);
SF("%d%d%d",&t,&n,&m);
for(int i=1;i<=m;i++){
SF("%d%d",&u,&v);
sta=u;
a[u].push_back(v);
id[u].push_back(i);
ind[v]++;
oud[u]++;
if(t==1){
a[v].push_back(u);
id[v].push_back(-i);
}
}
if(t==1){
for(int i=1;i<=n;i++)
ind[i]+=oud[i];
for(int i=1;i<=n;i++)
if(ind[i]%2==1)
st.push_back(i);
if(st.size()>2){
PF("NO");
return 0;
}
else if(st.size()==0)
st.push_back(sta);
dfs(st[0]);
}
else{
int cnt=0;
for(int i=1;i<=n;i++)
if(ind[i]!=oud[i]){
cnt++;
if(oud[i]>ind[i])
sta=i;
}
if(cnt>2){
PF("NO");
return 0;
}
dfs(sta);
}
for(int i=1;i<=m;i++)
if(vis[i]==0){
PF("NO");
return 0;
}
PF("YES\n");
while(!s.empty()){
PF("%d ",s.top());
s.pop();
}
}