省选专练(学习)Fleury算法

说白了就是一个暴力

由于如果知道了存在欧拉回路任意一个点任意一条边开始都能找到答案

省选专练(学习)Fleury算法_第1张图片

如果是找一张图的欧拉路

注意可以有连个奇数度数的情况,但是也能不判就跑过了(我不知道为什么我的Fleury这么优秀)

而且还有一个神仙优化:当前弧优化(6666)我咋这么菜呢

显而易见是吧

#include
#include
#include
#include
#include
#include
#include
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<

欧拉回路就更简单了

只能是偶数度数

省选专练(学习)Fleury算法_第2张图片

#include
#include
#include
#include
#include
#include
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<

 

你可能感兴趣的:(模板)