关于欧拉回路。
  • 板块学术版
  • 楼主ShanQing
  • 当前回复6
  • 已保存回复6
  • 发布时间2024/8/23 21:00
  • 上次更新2024/11/9 21:45:30
查看原帖
关于欧拉回路。
368204
ShanQing楼主2024/8/23 21:00

这个人觉得自己原本的欧拉回路板子太抽象所以决定照着网上别人代码写份新的。

然后交到了uoj上出现了不明白的WA。

//writer:Oier_szc

#include <bits/stdc++.h>
//#include <windows.h>
#define ED cerr<<endl;
#define TS cerr<<"I AK IOI"<<endl;
#define cr(x) cerr<<x<<endl;
#define cr2(x,y) cerr<<x<<" "<<y<<endl;
#define cr3(x,y,z) cerr<<x<<" "<<y<<" "<<z<<endl;
#define cr4(x,y,z,w) cerr<<x<<" "<<y<<" "<<z<<" "<<w<<endl;
#define pii pair<int,int>
#define mk make_pair
#define fi first
#define se second
//#define int long long
//#define ull unsigned long long
using namespace std;
const int N=1e5+5,M=2e5+5,INF=2e9,mod=1e9+7;
int t,n,m;
struct edge {
	int ne,to;
}e[M<<1];
int vis[M<<1],head[N],tot=1;
int in[N],out[N];
vector<int> ans;

void add(int u,int v) {
	e[++tot]={head[u],v};
	head[u]=tot;
}

void dfs1(int u) {
	for(int &i=head[u];i;i=e[i].ne) {
		if(vis[i]) continue;
		vis[i]=vis[i^1]=1;
		int id=(i&1)?-(i>>1):(i>>1);
		ans.emplace_back(id);
		dfs1(e[i].to);
	}
}

void dfs2(int u) {
	for(int &i=head[u];i;i=e[i].ne) {
		if(vis[i]) continue;
		vis[i]=1;
		int id=i-1;
		ans.emplace_back(id);
		dfs2(e[i].to);
	}
}

int main()
{
	scanf("%d",&t);
	scanf("%d%d",&n,&m);
	int u,v,s=0;
	for(int i=1;i<=m;++i) {
		scanf("%d%d",&u,&v);
		add(u,v),s=u;
		if(t==1) add(v,u);
		++in[v],++out[u];
	}
	for(int i=1;i<=n;++i) {
		if(t==1&&((in[i]+out[i])&1)||t==2&&in[i]!=out[i]) {
			puts("NO");
			return 0;
		}
	}
	if(t==1) dfs1(s);
	else dfs2(s);
	for(int i=2;i<=tot;++i) {
		if(!vis[i]) {
			puts("NO");
			return 0;
		}
	}
	puts("YES");
	for(int i=0;i<ans.size();++i) {
		printf("%d ",ans[i]);
	}
	return 0;
}

这份代码死在了无向图对应Subtask的第七个点。

然后照着某位不知名老哥的AC代码又改了改。

//writer:Oier_szc

#include <bits/stdc++.h>
//#include <windows.h>
#define ED cerr<<endl;
#define TS cerr<<"I AK IOI"<<endl;
#define cr(x) cerr<<x<<endl;
#define cr2(x,y) cerr<<x<<" "<<y<<endl;
#define cr3(x,y,z) cerr<<x<<" "<<y<<" "<<z<<endl;
#define cr4(x,y,z,w) cerr<<x<<" "<<y<<" "<<z<<" "<<w<<endl;
#define pii pair<int,int>
#define mk make_pair
#define fi first
#define se second
//#define int long long
//#define ull unsigned long long
using namespace std;
const int N=1e5+5,M=2e5+5,INF=2e9,mod=1e9+7;
int t,n,m;
struct edge {
	int ne,to;
}e[M<<1];
int vis[M<<1],head[N],tot=1;
int in[N],out[N];
vector<int> ans;

void add(int u,int v) {
	e[++tot]={head[u],v};
	head[u]=tot;
}

void dfs1(int u) {
	for(int &i=head[u];i;i=e[i].ne) {
		if(vis[i]) continue;
		vis[i]=vis[i^1]=1;
		int id=(i&1)?-(i>>1):(i>>1);
		dfs1(e[i].to);
		ans.emplace_back(id);//变成先dfs后计入答案 
	}
}

void dfs2(int u) {
	for(int &i=head[u];i;i=e[i].ne) {
		if(vis[i]) continue;
		vis[i]=1;
		int id=i-1;
		dfs2(e[i].to);
		ans.emplace_back(id);
	}
}

int main()
{
	scanf("%d",&t);
	scanf("%d%d",&n,&m);
	int u,v,s=0;
	for(int i=1;i<=m;++i) {
		scanf("%d%d",&u,&v);
		add(u,v),s=u;
		if(t==1) add(v,u);
		++in[v],++out[u];
	}
	for(int i=1;i<=n;++i) {
		if(t==1&&((in[i]+out[i])&1)||t==2&&in[i]!=out[i]) {
			puts("NO");
			return 0;
		}
	}
	if(t==1) dfs1(s);
	else dfs2(s);
	for(int i=2;i<=tot;++i) {
		if(!vis[i]) {
			puts("NO");
			return 0;
		}
	}
	puts("YES");
	for(int i=ans.size()-1;i>=0;--i) {//变成倒序 
		printf("%d ",ans[i]);
	}
	return 0;
}

A了。但个人找不到第一份代码的错误点在哪里,不知道dfs和计入答案的先后顺序对答案的影响。

2024/8/23 21:00
加载中...