题意:

【欧拉回路】四校联考1024T1


分析

非常简单的欧拉路板题

#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();
	}
}

相关文章:

  • 2021-10-20
  • 2022-12-23
  • 2022-12-23
  • 2021-04-04
猜你喜欢
  • 2021-07-04
  • 2022-01-25
  • 2022-12-23
  • 2021-06-22
相关资源
相似解决方案