解析
比较巧妙的一道题
首先做一棵dfs生成树出来
尝试把它的欧拉序列作为答案
但是这样可能会有的地方不符合条件
如果x点的奇偶性不符合,就在序列中加入一个(x,fa)
同时改变x和fa的奇偶性
显然不会超过4*n
如果根需要改奇偶性怎么办?
最后一次回溯删掉就行了
代码
#include<bits/stdc++.h>
using namespace std;
const int N=4e5+100;
const int mod=1e9+7;
double eps=1e-10;
#define ll long long
ll read(){ll x=0,f=1;char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();};while(isdigit(c)){x=x*10+c-'0';c=getchar();};return x*f;
}int n,m;
struct node{int to,nxt;
}p[N<<1];
int fi[N],cnt;
inline void addline(int x,int y){p[++cnt]=(node){y,fi[x]};fi[x]=cnt;return;
}
bool a[N],vis[N];
int q[N],tot;
void dfs(int x,int f){vis[x]=1;q[++tot]=x;a[x]^=1;for(int i=fi[x];~i;i=p[i].nxt){int to=p[i].to;if(vis[to]) continue;dfs(to,x);a[x]^=1;q[++tot]=x;}if(a[x]){q[++tot]=f;q[++tot]=x;a[f]^=1;a[x]^=1;}return;
}
int main(){#ifndef ONLINE_JUDGE//freopen("a.in","r",stdin);//freopen("a.out","w",stdout);#endifmemset(fi,-1,sizeof(fi));cnt=-1;n=read();m=read();for(int i=1;i<=m;i++){int x=read(),y=read();addline(x,y);addline(y,x);}int rt(0);for(int i=1;i<=n;i++){a[i]=read();if(a[i]) rt=i;}if(rt){dfs(rt,0);for(int i=1;i<=n;i++) if(a[i]){printf("-1\n");return 0;}}if(tot>1&&q[tot-1]==0) tot-=3;printf("%d\n",tot);for(int i=1;i<=tot;i++) printf("%d ",q[i]);return 0;
}
/*
2 3
7 4 9 9
1 2 8
3 1
4 2 4
*/