蒟蒻求助,搞了一天了这题
查看原帖
蒟蒻求助,搞了一天了这题
208776
Gavin0576楼主2020/7/29 07:42

我想问一下这个第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;
} 
2020/7/29 07:42
加载中...