假设数据输入时采用如下的格式进行输入:首先输入顶点个数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. JSP九大内置对象的作用和用法总结【转】

    JSP九大内置对象的作用和用法总结?     JSP中一共预先定义了9个这样的对象,分别为:request.response.session.application.out.pagecontext.c ...

  2. 获取一段HTML文本中的第一张图片与截取内容摘要

    有时候我们获得到的数据是一段HTML文本,也许这段文本里面有许多图片,需要截取一张作为标题图片,这时就可以用到下面这个方法获取到第一张图片: #region 获取第一张图片 /// <summa ...

  3. 【学习笔记】Base64编码解码原理及手动实现(C#)

    1.[Base64编码原理]@叶落为重生 -base64的编码都是按字符串长度,以每3个8bit的字符为一组,-然后针对每组,首先获取每个字符的ASCII编码,-然后将ASCII编码转换成8bit的二 ...

  4. Redis学习笔记(二)字符串进阶

    1.增减操作 字符串可以储存字节串.整数.浮点数三种类型的值,如果值无法被解释为十进制的整数或浮点数,那么对此值进行增减操作会返回错误,如果对一个不存在的或者保存了空串的键进行增减操作,Redis将当 ...

  5. web页面调用IOS的事件

    /** * js 调用ios的方法 * @param callback */ function connectWebViewJavascriptBridge(callback) { if (windo ...

  6. codevs 1422 河城荷取

    时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 在幻想乡,河城荷取是擅长高科技工业的河童.荷取的得意之作除了光学迷彩外,还有 ...

  7. Windows下使用python库 curses遇到错误消息的解决方案

    在Windows系统下执行python应用时,有时会遇到错误信息: ModuleNotFoundError: No module named '_curses'. 然而查看Windows系统里pyth ...

  8. C++#pragma pack指令

    微软官方文档说#pragma pack 指令的作用是为结构.联合和类成员指定 pack 对齐.的主要作用就是改变编译器的内存对齐方式,这个指令在网络报文的处理中有着重要的作用,#pragma pack ...

  9. swift的static和class修饰符---What is the difference between static func and class func in Swift?

    Special Kinds of Methods Methods associated with a type rather than an instance of a type must be ma ...

  10. 安装 配置 IIS

    一  .找到    控制面板 ------  在程序和功能  -----打开或关闭window 功能 :这里可能要等一下 才会显示 . 二‘.找到  Internet信息服务 ,勾选大部分如下图:点击 ...