【题解】欧拉回路

一:【题意】

数据强度极高

二:【代码】

#include<bits/stdc++.h>
#define Pair pair<int,int>
#define v first
#define id second
using namespace std;
const int N=1e5+10,M=2*N;
vector<Pair> mp[N];
int otd[N],ind[N],deg[N];
vector<int> st;
int vis[M];
void dfs(int u,int pa){
	while(mp[u].size()){
		auto e=mp[u].back();mp[u].pop_back();
		int v=e.v,id=e.id;
		if(vis[abs(id)]) continue;
		vis[abs(id)]=1;
		dfs(v,id);
	}
	st.push_back(pa);
}
int main(){
	int t;cin>>t;
	int n,m;cin>>n>>m;
	for(int i=1;i<=m;i++){
		int a,b;cin>>a>>b;
		if(t==1){
			mp[a].push_back({b,i});
			mp[b].push_back({a,-i});
			deg[a]++;
			deg[b]++;
		}
		else{
			mp[a].push_back({b,i});
			otd[a]++;
			ind[b]++;
		}
	}
	for(int i=1;i<=n;i++){
		if(t==1){
			if(deg[i]&1){
				cout<<"NO\n";
				return 0;
			}		
		}
		else{
			if(ind[i]!=otd[i]){
				cout<<"NO\n";
				return 0;
			}
		}
	}
	
	int S=-1;
	for(int i=1;i<=n;i++){
		if(mp[i].size()){
			S=i;
			break;
		}
	}
	
	if(S!=-1) dfs(S,0);
	if(st.size()-1<m){
		cout<<"NO\n";
		return 0;
	}
	cout<<"YES\n";
	reverse(st.begin(),st.end());
	for(auto v:st){
		if(v) cout<<v<<" ";
	}
	return 0;
}
posted @ 2026-01-13 19:25  Ming3398  阅读(15)  评论(0)    收藏  举报