说白了就是一个暴力
由于如果知道了存在欧拉回路任意一个点任意一条边开始都能找到答案
如果是找一张图的欧拉路
注意可以有连个奇数度数的情况,但是也能不判就跑过了(我不知道为什么我的Fleury这么优秀)
而且还有一个神仙优化:当前弧优化(6666)我咋这么菜呢
显而易见是吧
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<vector>
#include<cstdlib>
using namespace std;
const int N=1e5+100;
struct Front_star{
int u,v,Id,nxt;
}e[N*4];
int cnt=0;
int first[N];
int vis[N*2];
void add(int u,int v,int Id){
cnt++;
e[cnt].u=u;
e[cnt].v=v;
e[cnt].Id=Id;
e[cnt].nxt=first[u];
first[u]=cnt;
}
int n,m;
int Du[N];
struct Edge{
int u,v;
Edge(){};
void add(int a,int b){
u=a;
v=b;
}
int get(int a){
if(a==u)return v;
else return u;
}
}E[N*2];
int Ans[N*2];
int top=0;
void Fleury(int u){
for(int &i=first[u];i;i=e[i].nxt){
int Id=e[i].Id;
// cout<<Id<<" Id "<<'\n';
// cout<<E[Id].u<<" "<<E[Id].v<<'\n';
if(!vis[Id]){
int v=E[Id].get(u);
vis[Id]=1;
Fleury(v);
}
}
Ans[++top]=u;
}
int main(){
//freopen("323.in","r",stdin);
//freopen("323.out","w",stdout);
int size =20<< 20;
char *x = (char*)malloc(size) + size;
__asm__("movl %0, %%esp\n" :: "r"(x));
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
int u,v;
scanf("%d%d",&u,&v);
Du[u]++;
Du[v]++;
E[i].add(u,v);
add(u,v,i);
add(v,u,i);
}
int St=0;
for(int i=1;i<=n;++i)
if(Du[i]) {St=i;break ;}
int sum=0;
for(int i=1;i<=n;i++){
if(Du[i]%2==1){
sum++;
St=i;
}
}
if(sum==0||sum==2){
Fleury(St);
cout<<1<<'\n';
// cout<<top<<'\n';
for(int i=1;i<=top;i++){
cout<<Ans[i]<<" ";
}
}
else cout<<0;
return 0;
}
欧拉回路就更简单了
只能是偶数度数
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int N=1e5+100;
struct Front_star{
int u,v,Id,nxt;
}e[N*10];
int cnt=0;
int first[N];
int vis[N*10];
void add(int u,int v,int Id){
cnt++;
e[cnt].u=u;
e[cnt].v=v;
e[cnt].Id=Id;
e[cnt].nxt=first[u];
first[u]=cnt;
}
int n,m;
int Du[N];
struct Edge{
int u,v;
Edge(){};
void add(int a,int b){
u=a;
v=b;
}
int get(int a){
if(a==u)return v;
else return u;
}
}E[N];
int Ans[N*10];
int top=0;
void Fleury(int u){
// cout<<u<<'\n';
for(int i=first[u];i;i=e[i].nxt){
int Id=e[i].Id;
// cout<<Id<<" Id "<<'\n';
// cout<<E[Id].u<<" "<<E[Id].v<<'\n';
if(!vis[Id]){
int v=E[Id].get(u);
vis[Id]=1;
Fleury(v);
}
}
Ans[++top]=u;
}
int main(){
// freopen("hihocoder1181.in","r",stdin);
scanf("%d",&n);
int u,v;
int idx=0;
int ttt=0;
while(~scanf("%d%d",&u,&v)){
++idx;++ttt;
Du[u]++;
Du[v]++;
E[idx].add(u,v);
add(u,v,idx);
add(v,u,idx);
}
int St=1;
int sum=0;
for(int i=1;i<=n;i++){
if(Du[i]%2==1){
sum++;
St=i;
}
}
if(sum==0)
{
Fleury(St);
if(ttt+1==top)
{
cout<<1<<'\n';
for(int i=1;i<=top;i++) cout<<Ans[i]<<" ";
}
else puts("0");
}
else cout<<0;
return 0;
}