假设数据输入时采用如下的格式进行输入:首先输入顶点个数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. Nagios安装与部署

    Nagios概述: Nagios是一款开源免费(也有收费版的Nagios XI)的监控工具,可以用以监控Windows.Linux.Unix.Router.Switch,可以监控指定主机的物理基础资源 ...

  2. .net core跨域设置

    services.AddCors(options => options.AddPolicy("AllowSameDomain", builder => builder. ...

  3. Windows下降权MYSQL和apche的运行级别(普通用户权限运行)

    1.MYSQL的降权运行  新建立一个用户比如mysql  net user mysql microsoft /add  net localgroup users mysql /del  不属于任何组 ...

  4. qconbeijing2017

    http://2017.qconbeijing.com/schedule 第一天 (2017年4月16日/星期日)   签到 专题 主题演讲 快速进化的容器生态 微服务与 DevOps 最佳实践(厂商 ...

  5. postman断言分析

    最近测试中用到postman,使用后就简单总结下常用的断言,下面带图的自己最常用的,其他的没怎么用. postman断言是JavaScript语言编写的,在postman客户端指定区域编写即可. 断言 ...

  6. 第一章、 CLR的执行模型

    1. 概述 本章主要是介绍从源代码到可执行程序的过程中,CLR所做的工作. 2. 名词解释 ① 公共语言运行时(Common Language Runtime, CLR),是一个可由多种语言使用的 运 ...

  7. [Java 8] (8) Lambda表达式对递归的优化(上) - 使用尾递归 .

    递归优化 很多算法都依赖于递归,典型的比如分治法(Divide-and-Conquer).但是普通的递归算法在处理规模较大的问题时,常常会出现StackOverflowError.处理这个问题,我们可 ...

  8. Cognos邮件发送

    1.打开报表,点击下图的标记 2.设置发送格式收件人 3.设置报表格式 4.设置发送内容

  9. vue2.0组件生命周期探讨

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  10. QT+信号有参数与无参数的实现+QT4和QT5在信号和槽使用上的区别

    在QT5中,信号有参数和无参数 #ifndef SUBWIDGET_H #define SUBWIDGET_H #include <QWidget> #include <QPushB ...