fluery算法

 1 #include<stdio.h>
 2 #include<string.h>
 3 struct stack
 4 {
 5     int top;
 6     int node[100];
 7 }s;
 8 int n,map[100][100];
 9 void dfs(int x)
10 {
11     int i,j;
12     s.top++;
13     s.node[s.top]=x;
14     for(i=0;i<n;i++)
15     {
16         if(map[i][x])
17         {
18             map[i][x]=map[x][i]=0;
19             dfs(i);
20             break;
21         }
22     }
23 }
24 void fleury(int start)
25 {
26     int i,j;
27     s.top=0;s.node[s.top]=start;
28     while(s.top>=0)
29     {
30         int flag=0;
31         for(i=0;i<n;i++)
32         {
33             if(map[s.node[s.top]][i])
34             {
35                 flag=1;break;
36             }
37         }
38         if(!flag)
39         {
40             printf("%d ",s.node[s.top]+1);
41             s.top--;
42         }
43         else
44         {
45             s.top--;
46             dfs(s.node[s.top+1]);
47         }
48     }
49 }
50 int main()
51 {
52     int i,j,m,dgree;
53     while(scanf("%d%d",&n,&m)!=EOF)
54     {
55         memset(map,0,sizeof(map));
56         for(i=0;i<m;i++)
57         {
58             int s,t;
59             scanf("%d%d",&s,&t);
60             map[s-1][t-1]=map[t-1][s-1]=1;
61         }
62         int num=0,start=0;
63         for(i=0;i<n;i++)
64         {
65             dgree=0;
66             for(j=0;j<n;j++)
67             {
68                 if(map[i][j])
69                     dgree++;
70             }
71             if(dgree%2)
72             {
73                 num++;
74                 start=i;
75             }
76         }
77         if(num==0||num==2)
78             fleury(start);
79         else printf("NO\n");
80     }
81     return 0;
82 }
83 /*
84 9 14
85 1 2
86 1 8
87 2 3
88 2 8
89 2 9
90 3 4
91 4 5
92 4 6
93 4 9
94 5 6
95 6 7
96 6 9
97 7 8
98 8 9
99 */
时间: 2024-08-12 12:08:36

fluery算法的相关文章

UVA 10735 Euler Circuit 混合图的欧拉回路(最大流,fluery算法)

题意:给一个图,图中有部分是向边,部分是无向边,要求判断是否存在欧拉回路,若存在,输出路径. 分析:欧拉回路的定义是,从某个点出发,每条边经过一次之后恰好回到出发点. 无向边同样只能走一次,只是不限制方向而已,那么这个情况下就不能拆边.不妨先按照所给的start和end的顺序,初步定下该无向边的顺序(若不当,一会再改).那么有个问题,我们需要先判断其是否存在欧拉回路先. 混合图不满足欧拉回路因素有:(1)一个点的度(无论有无向)是奇数的,那么其肯定不能满足出边数等于入边数.(2)有向边的出入度过

HDU 5348 MZL&#39;s endless loop 给边定向(欧拉回路,最大流)

题意:给一个所有你可能想得到的奇葩无向图,要求给每条边定向,使得每个点的入度与出度之差不超过1.输出1表示定向往右,输出0表示定向往左. 思路: 这题本来很简单的事,在每两个奇数度的点添加1条无向边,就变成了个欧拉回路了.欧拉回路的定义时,只要每个点的度为偶数,必定有欧拉回路的存在.只需要选择任1个点出发,遍历每条边仅1次,得到就是欧拉回路路径了,再根据每条边的方向选0/1.添加的那些无向边都是不会影响答案的,因为欧拉回路跑得起来肯定是每个点的出度等于入度,而每个点最多只会被多加1条边,根据题目

图论--欧拉路,欧拉回路(小结)

在题目中在慢慢细说概念 1.HDU - 3018 Ant Trip 题目大意:又N个村庄,M条道路,问需要走几次才能将所有的路遍历 解题思路:这题问的是有关欧拉路的判定 欧拉路就是每条边只能走一次,且要遍历所有的边,简单的说就是一笔画(图连通) 这道题是无向图的欧拉路,无向图的欧拉路的判定:所有点的度数都是偶数度,或者只有两个点的度是奇数度,且图要是连通图 知道欧拉路是什么后,这题就比较好做了,第一件事就是找到有几个连通块,然后再判断一下每个连通块需要几笔才能完成就好了 #include <cs

[模板][持续更新]欧拉回路与欧拉路径浅析

Luogu P2731 骑马修栅栏 Riding the Fences 题目背景 Farmer John每年有很多栅栏要修理.他总是骑着马穿过每一个栅栏并修复它破损的地方. 题目描述 John是一个与其他农民一样懒的人.他讨厌骑马,因此从来不两次经过一个栅栏.你必须编一个程序,读入栅栏网络的描述,并计算出一条修栅栏的路径,使每个栅栏都恰好被经过一次.John能从任何一个顶点(即两个栅栏的交点)开始骑马,在任意一个顶点结束. 每一个栅栏连接两个顶点,顶点用1到500标号(虽然有的农场并没有500个

POJ2337 Catenyms 欧拉路径的输出

题目链接: poj2337 题意: 给出一些字符串,问能否将这些字符串  按照 词语接龙,首尾相接  的规则 使得每个字符串出现一次 如果可以 按字典序输出这个字符串序列 解题思路: 1.将每个字符串的首尾单词理解为图中的点,将字符串理解为边构图 2根据入度出度判断是否能构成欧拉路径 3并查集判断连通性 4将所有字符串按字典序排序可以使用sort排序 5欧拉路径的输出    用到fluery算法的思想: 设G 为一无向欧拉图,求G 中一条欧拉回路的算法为: 1) 任取G 中一顶点v0,令P0 =

CCF-CSP题解 201512-4 送货

求字典序最小欧拉路. 似乎不能用\(Fluery\)算法(\(O(E^2)\)).\(Fluery\)算法的思路是:延申的边尽可能不是除去已走过边的图的桥(割).每走一步都要判断是否是割,应当会超时. 采用\(Hierholzer\)算法(\(O(V+E)\)),亦称逐步插入回路法.思路见代码.注意根据题意,每次选取未走过顶点最小的边延申. 注意题目要求从1号节点出发. 欧拉路存在的条件: 无向图: 存在欧拉回路的条件:原图连通,每个节点均为偶度节点. 存在欧拉通路的条件:存在欧拉回路,或原图连

经典排序算法 - 冒泡排序Bubble sort

 原文出自于 http://www.cnblogs.com/kkun/archive/2011/11/23/bubble_sort.html 经典排序算法 - 冒泡排序Bubble sort 原理是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换, 这样一趟过去后,最大或最小的数字被交换到了最后一位, 然后再从头开始进行两两比较交换,直到倒数第二位时结束,其余类似看例子 例子为从小到大排序, 原始待排序数组| 6 | 2 | 4 | 1 | 5 | 9 | 第一趟排序(外循环) 第

转载:DenseNet算法详解

原文连接:http://blog.csdn.net/u014380165/article/details/75142664 参考连接:http://blog.csdn.net/u012938704/article/details/53468483 本文这里仅当学习笔记使用,具体细节建议前往原文细度. 论文:Densely Connected Convolutional Networks 论文链接:https://arxiv.org/pdf/1608.06993.pdf 代码的github链接:h

基于位置信息的聚类算法介绍及模型选择

百度百科 聚类:将物理或抽象对象的集合分成由类似的对象组成的多个类的过程被称为聚类.由聚类所生成的簇是一组数据对象的集合,这些对象与同一个簇中的对象彼此相似,与其他簇中的对象相异."物以类聚,人以群分",在自然科学和社会科学中,存在着大量的分类问题.聚类分析又称群分析,它是研究(样品或指标)分类问题的一种统计分析方法.聚类分析起源于分类学,但是聚类不等于分类.聚类与分类的不同在于,聚类所要求划分的类是未知的. 分类和聚类算法一直以来都是数据挖掘,机器学习领域的热门课题,因此产生了众多的