假设数据输入时采用如下的格式进行输入:首先输入顶点个数n和边数m,然后输入每条边,每条边的数据占一行,格式为:u,v,表示从顶点u到顶点v的一条有向边

这里把欧拉回路的路径输出了出来:

手写栈:

 #include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define N 1005
int first[N],k,degree[N],visit[N];
struct stack{
int top,node[N];
}s;
struct Path{
int y,next,flag;
}path[N<<];
void add(int x,int y)
{
path[k].y=y,path[k].next=first[x],path[k].flag=k;
first[x]=k;
k++;
path[k].y=x,path[k].next=first[y],path[k].flag=k-;
first[y]=k;
k++;
}
void dfs(int u)
{
s.node[++s.top]=u;
for(int i=first[u];i!=-;i=path[i].next){
if(!visit[path[i].flag]){
visit[path[i].flag]=;
dfs(path[i].y);
break;
}
}
}
void Fleury(int x)
{
int b;
s.top=;
s.node[s.top]=x;
while(s.top>=){
b=;
int u=s.node[s.top];
for(int i=first[u];i!=-;i=path[i].next){
if(!visit[path[i].flag]){
b=;
break;
}
}
if(b==){//如果没有点可以扩展
printf("%d ",s.node[s.top]);
s.top--;
}
else{
s.top--;
dfs(s.node[s.top+]);
}
}
}
int main()
{
int n,m,u,v;
scanf("%d%d",&n,&m);
k=;
memset(first,-,sizeof(first));
memset(degree,,sizeof(degree));
memset(visit,,sizeof(visit));
for(int i=;i<m;i++){
scanf("%d%d",&u,&v);
add(u,v);
degree[u]++,degree[v]++;
}
int odd=,st=;
for(int i=;i<=n;i++){
if(degree[i]&) odd++,st=i;
}
if(odd==||odd==) {Fleury(st);}
else printf("No Euler path\n");
return ;
}

stl容器栈:

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <stack>
using namespace std;
#define N 1005
int first[N],k,degree[N],visit[N];
stack<int> s;
struct Path{
int y,next,flag;
}path[N<<];
void add(int x,int y)
{
path[k].y=y,path[k].next=first[x],path[k].flag=k;
first[x]=k;
k++;
path[k].y=x,path[k].next=first[y],path[k].flag=k-;
first[y]=k;
k++;
}
void dfs(int u)
{
s.push(u);
for(int i=first[u];i!=-;i=path[i].next){
if(!visit[path[i].flag]){
visit[path[i].flag]=;
dfs(path[i].y);
break;
}
}
}
void Fleury(int x)
{
int b;
s.push(x);
while(!s.empty()){
b=;
int u=s.top();
for(int i=first[u];i!=-;i=path[i].next){
if(!visit[path[i].flag]){
b=;
break;
}
}
if(b==){//如果没有点可以扩展
printf("%d ",s.top());
s.pop();
}
else{
s.pop();
dfs(u);
}
}
}
int main()
{
int n,m,u,v;
scanf("%d%d",&n,&m);
k=;
memset(first,-,sizeof(first));
memset(degree,,sizeof(degree));
memset(visit,,sizeof(visit));
for(int i=;i<m;i++){
scanf("%d%d",&u,&v);
add(u,v);
degree[u]++,degree[v]++;
}
int odd=,st=;
for(int i=;i<=n;i++){
if(degree[i]&) odd++,st=i;
}
if(odd==||odd==) {Fleury(st);}
else printf("No Euler path\n");
return ;
}

输入:
9 14
1 2
1 8
2 3
2 8
2 9
3 4
4 5
4 6
4 9
5 6
6 7
6 9
7 8
8 9

结果:

1 2 3 4 5 6 4 9 2 8 7 6 9 8 1

简单的Fleury算法模板的更多相关文章

  1. 算法模板学习专栏之总览(会慢慢陆续更新ing)

    博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/7495310.html特别不喜欢那些随便转载别人的原创文章又不给 ...

  2. 最短路问题的三种算法&模板

    最短路算法&模板 最短路问题是图论的基础问题.本篇随笔就图论中最短路问题进行剖析,讲解常用的三种最短路算法:Floyd算法.Dijkstra算法及SPFA算法,并给出三种算法的模板.流畅阅读本 ...

  3. DFS 算法模板

    dfs算法模板: 1.下一层是多节点的dfs遍历 def dfs(array or root, cur_layer, path, result): if cur_layer == len(array) ...

  4. 匈牙利 算法&模板

    匈牙利 算法 一. 算法简介 匈牙利算法是由匈牙利数学家Edmonds于1965年提出.该算法的核心就是寻找增广路径,它是一种用增广路径求二分图最大匹配的算法. 二分图的定义: 设G=(V,E)是一个 ...

  5. Tarjan 算法&模板

    Tarjan 算法 一.算法简介 Tarjan 算法一种由Robert Tarjan提出的求解有向图强连通分量的算法,它能做到线性时间的复杂度. 我们定义: 如果两个顶点可以相互通达,则称两个顶点强连 ...

  6. hdu 2255 奔小康赚大钱--KM算法模板

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2255 题意:有N个人跟N个房子,每个人跟房子都有一定的距离,现在要让这N个人全部回到N个房子里面去,要 ...

  7. POJ 1273 Drainage Ditches(网络流dinic算法模板)

    POJ 1273给出M条边,N个点,求源点1到汇点N的最大流量. 本文主要就是附上dinic的模板,供以后参考. #include <iostream> #include <stdi ...

  8. 非刚性图像配准 matlab简单示例 demons算法

    2011-05-25 17:21 非刚性图像配准 matlab简单示例 demons算法, % Clean clc; clear all; close all; % Compile the mex f ...

  9. poj 1274 The Perfect Stall【匈牙利算法模板题】

    The Perfect Stall Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 20874   Accepted: 942 ...

随机推荐

  1. HBase文档操作--练习篇

    1.查询学生的所有信息 数据准备 var persons = [{ name:"jim", age:25, email:"75431457@qq.com", c ...

  2. php Try Catch多层级异常测试

    <?php class a { public function a1 () { try { throw new Exception('123'); } catch (Exception $e) ...

  3. Spring boot Jpa添加对象字段使用数据库默认值

    Spring boot Jpa添加对象字段使用数据库默认值 jpa做持久层框架,项目中数据库字段有默认值和非空约束,这样在保存对象是必须保存一个完整的对象,但在开发中我们往往只是先保存部分特殊的字段其 ...

  4. 初学web前端,掌握这些就足够了!

    Web开发如今是如日中天,热的发烫.那我们应该怎么学习呢?这不光是初学者,很多学了几年的人也会有些迷茫或者彷徨,大家也都知道不断学习是不可避免的,不学习肯定要掉队:那怎么学效率更高,那些是坑,那些是路 ...

  5. Azure PowerShell 在ARM环境下使用指定 vhd(本地化后的磁盘) 来创建虚拟机

    #此脚本用于 Azure 存储账户中已有 vhd 镜像文件创建虚拟机,一般用于做好镜像测试 #----------------------------------------------------- ...

  6. Chomp游戏(必胜策略分析)

    游戏简介 Chomp是一个双人游戏,有m x n块曲奇饼排成一个矩形格状,称作棋盘. ----两个玩家轮流自选一块还剩下的曲奇饼,而且还要把它右边和下边所有的曲奇饼都取走(如果存在) ----先吃到左 ...

  7. dockerfile 的最佳实践

    Dockerfile 编写nginx容器 [root@mast nginx]# cat Dockerfile FROM centos MAINTAINER zhaoruidong RUN yum -y ...

  8. 原生查找DOM的方法

    JS获取DOM元素的方法(8种) 通过ID获取(getElementById) 通过name属性(getElementsByName) 通过标签名(getElementsByTagName) 通过类名 ...

  9. while循环(break、continue)

    while循环 流程:判断条件是否为真,如果条件为真,执行代码块,然后再次判断条件是否为真,如果为真,执行代码块,直到条件判断为假,结束循环 格式 while  条件: 代码块(循环体) else:- ...

  10. python基础一 day2 字符串操作

    s.capitalize()  s.upper()  s.lower() s.swapcase()   s.title()  s.center(20,"#")   s.expand ...