我想问一下这个第14个点t掉是我自己算法复杂度有问题还是搜索里面死循环卡掉了pup
#include<bits/stdc++.h>
using namespace std;
#define SIZE 1000010
int Ver[SIZE],Next[SIZE],Head[SIZE];
int tot=0,a[SIZE],vis[SIZE],Fa;
int n,m,cnt=0;
int Ans[SIZE],dep[SIZE],fa[SIZE],VIS[SIZE];
int find(int x){
return fa[x]==x? x:(fa[x]=find(fa[x]));
}
void Add(int x,int y){
Ver[++tot]=y;
Next[tot]=Head[x];
Head[x]=tot;
}
bool check(int k){//检验有几个不符合要求的点
for(int i=1;i<=n;i++)
if(k==find(i))
if(vis[i]%2!=a[i]) return 0;
return 1;
}
void dfs(int x,int fa){
Ans[++cnt]=x;vis[x]++;
if(check(Fa)) return ;
if(dep[x]==1&&fa!=0){//叶子结点
if(a[x]%2==0){
if(vis[x]%2==1){//不符合要求到父节点重新遍历一遍
Ans[++cnt]=fa;
vis[fa]++;
Ans[++cnt]=x;
vis[x]++;
Ans[++cnt]=fa;
vis[fa]++;
return ;
}
}
else{
Ans[++cnt]=fa;//不然直接回溯
vis[fa]++;
return ;
}
}
else{
if(a[x]%2==1&&vis[x]%2==0){
if(fa!=0){//不符合要求回父节点重新遍历
Ans[++cnt]=fa;
vis[fa]++;
Ans[++cnt]=x;
vis[x]++;
Ans[++cnt]=fa;
vis[fa]++;
return ;
}
else{
if(check(Fa)) return;
for(int i=Head[x];i;i=Next[i]){
if(check(Fa)) return;
int y=Ver[i];
if(y==0) continue;
if(a[y]%2==0&&vis[y]%2==0&&vis[2]) continue;
if(a[y]%2==1&&vis[y]%2==1) continue;
if(a[y]%2==1){
dfs(y,x);
break;
}
}
}
return;
}
}
for(int i=Head[x];i;i=Next[i]){
if(check(Fa)) return;
int y=Ver[i];
if(vis[y]>=4) continue;
if(y==fa||y==0)continue;
dfs(y,x);
if(check(Fa)) return;
if(dep[y]!=1){
Ans[++cnt]=x;
vis[x]++;
}
}
for(int i=Head[x];i;i=Next[i]){//检验一下有没有符合要求,没有的话重新遍历子节点
int y=Ver[i];
if(a[y]%2==0&&vis[y]%2==1){
Ans[++cnt]=y;
vis[y]++;
if(check(Fa)) return;
Ans[++cnt]=x;
vis[x]++;
}
if(a[y]%2==1&&vis[y]%2==0){
Ans[++cnt]=y;
vis[y]++;
if(check(Fa)) return;
Ans[++cnt]=x;
vis[x]++;
}
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) fa[i]=i;
for(int i=1;i<=m;i++){
int x,y;
scanf("%d%d",&x,&y);
if(find(x)==find(y)) continue;
if(tot/2==n-1) break;
fa[find(y)]=find(x);
Add(x,y);Add(y,x);
dep[x]++;dep[y]++;
}
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
bool ff=true;
for(int i=n;i>=1;i--){
Fa=find(i);
if(check(Fa)) continue;
if(ff==false){
printf("-1\n");
return 0;
}
ff=false;
dfs(i,0);
}
printf("%d\n",cnt);
for(int i=1;i<=cnt;i++) printf("%d ",Ans[i]);
return 0;
}