首先介绍一下fleury算法。
大概描述是这样子的:
(1)设图G的顶点集为V(G), 从中任取一个顶点V0,令P0 = V0;
(2)设Pi=v0e1v1e2...eivi已经行遍,按下面的方面来从E(G)-{e1, e2, ..., ei}中选取ei+1:
(2.1)ei+1与vi相关联,也就是,从vi射出。
(2.2)除非无别的边可供选择,否则ei+1不应该为Gi=G-{e1, e2, ..., ei}中的桥。所谓的桥,是指当把它从图中删除时,原本连通的图不连通了。
(3)当(2)不能再进行时,算法停止。
算法的思想我是理解的,不过我也没有实现。在网上看到一个用递归实现的算法,很简洁,可是我不确定它是否是fleury算法,因为我没有看到有关边的选择是如何优先避开桥的。先贴这里吧。
void dfs( int** g, int vnum, int id, int* s, int* front ){
int i;
s[++(*front)] = id;
for( i=0; i<vnum; i++ ){
if( g[i][id]>0 ){
g[i][id] --;
g[id][i] --;
dfs(g, vnum, i, s, front);
break;
}
}
}
void eulerPath( int** g, int vnum, int x ){
int* stack = (int*)malloc( sizeof(int)*vnum );
int front = 0;
stack[front] = x;
int i, b;
while( front>=0 ){
b = 0;
for( i=0; i<vnum; i++ ){
if( g[stack[front]][i] > 0 ){
b = 1;
break;
}
}
if( b == 0 ){
printf( "%d ", stack[front] );
front -- ;
}else{
front--;
dfs( g, vnum, stack[front+1],stack, &front );
}
}
printf( "end of eulerPath\n" );
free( stack );
}
递归得很厉害。我又想不大明白。于是就自己照着书本的那个证明,做了如下的画圈圈的算法。
typedef struct node{
int id;
struct node* next;
struct node* prev;
}pathNode;
typedef struct {
struct node* head;
struct node* current;
}path;
//this function finds the euler route and return its head
path* eulerCircle( int** g, int* indgr, int num ){
path* p = (path*)malloc( sizeof(path) );
p->head = (pathNode*)malloc( sizeof( pathNode ) );
(p->head)->id = 0;
(p->head)->prev = NULL;
(p->head)->next = NULL;
//without lose of generality, we start our search from v0
p->current = p->head;
int i;
int count=0, top=0;
while( count < num ){
path* ptmp = (path*)malloc( sizeof(path) );
ptmp->head = (pathNode*)malloc( sizeof( pathNode ) );
ptmp->head->id = -1;
ptmp->head->prev = NULL;
ptmp->head->next = NULL;
ptmp->current = ptmp->head;
int c=top;
//this while loop is to find a loop in the graph
while(1){
for( i=0; i<num; i++ ){
if( g[c][i] > 0 ){
g[c][i]--;
g[i][c]--;
indgr[c]--;
indgr[i]--;
if( indgr[c] == 0 )
count++;
if( indgr[i] == 0 )
count++;
c = i;
ptmp->current->id = i;
pathNode* t = (pathNode*)malloc( sizeof(pathNode) );
t->id = -1;
t->next = NULL;
ptmp->current->next = t;
t->prev = ptmp->current;
ptmp->current = t;
break;
}
}
if( c == top )
break;
}
pathNode* t = ptmp->current;
pathNode* tt = p->current->next;
//find a new circle from vertex top
if( t->prev != NULL ){
ptmp->current = ptmp->current->prev;
ptmp->current->next = NULL;
free( t );
p->current->next = ptmp->head;
ptmp->head->prev = p->current;
p->current = ptmp->current;
p->current->next = tt;
if( tt != NULL )
tt->prev = p->current;
}else{
free( t );
free( ptmp );
}
//modify the value of top, to start a new circle
tt = p->current;
while( tt != NULL ){
if( indgr[tt->id] > 0 ){
top=tt->id;
p->current = tt;
break;
}
tt = tt->prev;
}
}
return p;
}
//this function prints the path we've just found
void printPath( path* p ){
if( p == NULL ){
printf( "NULL pointer\n" );
return ;
}
pathNode* head = p->head;
pathNode* t = head;
for( t=head; t!=NULL; t=t->next )
printf( "%d->", t->id );
printf( "\n" );
}
//this function frees the path we constructed in eulerCircle
void freePath( path* p ){
if( p == NULL ){
printf( "NULL pointer\n" );
return ;
}
pathNode* head = p->head;
pathNode* t = head;
while( head != NULL ){
t = head->next;
free(head);
head = t;
}
}
大概思想是这样子的:首先找到一个圈,将圈上的边去掉,此时图中顶点的入度依然为偶数(或者为0),从刚才的圈中任找一个入度不为0的顶点(肯定至少存在一个,不然图就是不连通的了),再找一个圈,也就是说,像原先0->1->2->0的圈,假如从2出发有2->5->6->4->2的圈,那么现在就可以形成一个0->1->2->5->6->4->2->0的圈了。所以其实结果我的主要任务就变成维护好这个列表了,呵呵。。。如果用高级一点的数据结构的话,是不需要多少代码的。。哈哈。这个算法就是我用在中国邮递员里面的算法。
我还是希望有个人能跟我讲讲上面那个递归的算法。。也或许是我对深搜还没有真正透彻的理解吧。
分享到:
相关推荐
11KW OBC两电平pfc+cllc仿真源码实现:单相与三相兼容版双向控制研究,11KW OBC两电平pfc+cllc仿真源码实现:单相与三相兼容版,实现双向控制策略,11KW OBC两电平pfc+cllc仿真,源代码实现。 注意:已成单相,三相兼容版仿真文件。 双向控制。 ,核心关键词:11KW OBC两电平pfc; CLLC仿真; 源代码实现; 单相三相兼容; 双向控制。,11KW OBC单相与三相兼容版仿真:两电平PFC+CLLC双向控制源代码实现
3GPP R15 38.331 5G NR无线资源控制(RRC)协议规范解析
五运六气YUNQI_V471_SRC_D1023
19考试真题最近的t63.txt
基于MATLAB的牛拉法电力系统潮流计算程序,结合BPA方法,附参考文献,适合基础学习与拓展创新,基于MATLAB的牛拉法电力系统潮流计算程序:涵盖基础学习与拓展创新,附参考文献,牛拉法电力系统潮流计算 MATLAB编写潮流计算程序 BPA计算潮流 另外包含参考文献 这个程序把潮流计算的一般流程包括了,非常适合基础学习,并进一步的进行拓展创新 ,牛拉法; 电力系统潮流计算; MATLAB; BPA计算; 程序编写; 流程; 基础学习; 创新拓展,基于MATLAB的牛拉法电力系统潮流计算程序:基础学习与拓展创新指南
YOLOv11m权重文件
高一-语文-2025年1月张家界市高一期末联考-缺考不计、违纪不计、0分不计_2025-01-16-12-21 (1).zip
android kotlin 版本的贪吃蛇游戏
19考试真题最近的t57.txt
基于疫情封控区域的生活物资配送优化模型:结合遗传算法与模拟退火,实现时间最短和综合满意率最高的路径优化。,疫情下封控区域生活物资配送优化模型:结合遗传算法与模拟退火算法求解路径优化问题,实现时间与满意率双重目标优化。,模型及MATLAB代码:考充分考虑并结合疫情下封控区域生活物资配送问题及车辆路径问题的特点构建物资配送优化模型。 在一般单一目标——时间最短的基础上,加入综合满意率优化目标的路径优化问题 关键词:遗传算法、改进、模拟 火算法,路径优化、CVRP 完整模型+代码+注释 主要内容:以配送时间最短及综合满足率最高为目标,充分考虑并结合疫情下封控区域生活物资配送问题及车辆路径问题的特点构建物资配送优化模型,为疫情下生活物资配送找到了更好的思路。 在模型设计与求解问题上,首先设计标准遗传算法,继而对算法加以改进,最后设计出了改进遗传-模拟 火算法对模型进行求解。 还有参数灵敏度分析等。 服务内容:脚本 工具 部分展示如下: ,关键词:疫情下物资配送;车辆路径问题;优化模型;遗传算法;改进;模拟退火算法;CVRP;参数灵敏度分析;脚本工具;时间最短;综合满意率。 核心关键词用分号分
## 01、数据介绍 动态能力理论最早由提斯(Teece)与皮萨洛(Pisano)于1994年正式提出,他们将动态能力定义为“能够创造新产品和新过程,以及对变化的市场环境做出响应的一系列能力”。 动态能力具体体现在吸收能力、创新能力和适应能力三个方面。这些能力使公司能够快速适应市场变化,抓住新的商业机会,从而保持或提升竞争优势。 数据名称:上市公司-动态能力数据 数据年份:2012-2023年 ## 02、相关数据及指标 证券代码 证券名称 年份 Symbol RD IA ACV DC
基于ASIO的插件式服务器,支持TCP, UDP, 串口,Http, Websocket,统一化的数据接口,隔离开发人员和IO之间的操作。可以快速迭代。PSS 是针对不同 IO 逻辑的插件管理系统。您可以忽略 IO 建立的细节,构建自己的 logic 应用程序。PSS 封装了 Tcp、udp、kcp、串行端口、http、websocket 和 ssl 的统一接口。您可以使用 配置文件 或 统一接口 来创建和使用它们。logic plug-in 是完成数据到达后的 logic 处理,全部以动态库的形式加载,将 IO 和 logic 本身的耦合分开。简单的逻辑开发。本项目由三部分组成 (1) 主机(2) 数据包分析插件(3) 逻辑处理插件。您可以实现后两个插件来完成您的业务逻辑部署。
电机控制器源码:通用无感BLDC方波控制,高效参数化启动,转速达12w,环控系统一键调节,电机控制器源码:通用无感BLDC方波控制,高效调速,参数宏定义便捷调试,最高电转速达12w,电机控制器,低压无感BLDC方波控制,全部源码,方便调试移植 1.通用性极高,图片中的电机,一套参数即可启动。 2. ADC方案 3.电转速最高12w 4.电感法和普通三段式 5.按键启动和调速 6.开环,速度环,限流环 7.参数调整全部宏定义,方便调试 代码全部源码 ,电机控制器;低压无感BLDC方波控制;全部源码;通用性极高;电转速最高12w;电感法与普通三段式;按键启动调速;开环、速度环、限流环;参数调整宏定义。,通用电机控制器:低压无感BLDC方波控制源码,支持高转速12W,便捷调试移植
基于MPC的电动汽车分布式协同自适应巡航控制:上下分层控制与仿真结果展示,基于MPC的电动汽车协同自适应巡航控制:上下分层控制与仿真结果展示,基于MPC的分布式电动汽车协同自适应巡航控制,采用上下分层控制方式,上层控制器采用模型预测控制mpc方式,产生期望的加速度,下层根据期望的加速度分配扭矩;仿真结果良好,能够实现前车在加减速情况下,规划期望的跟车距离,产生期望的加速度进行自适应巡航控制。 ,关键词:MPC(模型预测控制); 分布式电动汽车; 协同自适应巡航控制; 上下分层控制方式; 期望加速度; 扭矩分配; 仿真结果良好; 前车加减速; 跟车距离。,基于MPC的分层控制电动汽车自适应巡航系统,仿真实现前车加减速跟车距离自适应
多维度购电与售电模型构建及基于CVaR与WOA优化的收益风险评估方法研究,基于CVaR风险评价及WOA优化的新型售电公司购售电模型与策略仿真研究,建立了一个电公司的购电侧模型和电侧模型,其中购电侧模型包括长期市场业务,现市场业务,可再生能源购电市场业务,分布式电源购电市场业务以及储能租赁市场业务五种类型。 电侧包括均 电价合同和实时电价合同两种类型。 然后在购电模型的基础上,提出了一种基于CVaR的购电收益风险评价方法。 根据电公司的CVaR购电收益风险数学模型,提出了一种基于WOA优化算法的新型购电收益计算方法。 该方法将购电收益风险计算公式作为WOA优化算法的目标函数,然后通过WOA的鲸鱼行走觅食、鲸鱼包围以及鲸鱼螺旋捕食三个步骤计算电公司的最优购电策略。 最后,通过MATLAB仿真工具对本文所研究的基于WOA优化的新型购电收益计算方法进行了仿真分析。 仿真结论验证了通过WOA优化算法得到的购电策略为最优购电策略。 matlab代码 仿真平台:MATLAB平台 代码具有一定的深度和创新性,注释清晰 ,关键词: 1. 购电侧模型; 2. 售电侧模型; 3. 长期/现货/可再生
迅雷软件下载原理介绍.md
## 01、数据简介 碳排放是指在人类活动中,如能源消耗、工业生产、交通运输、农业活动等过程中向大气中释放的二氧化碳等温室气体的行为。这些温室气体在大气中形成隔热层,导致地球气温升高,引发全球气候变化。分行业碳排放则是指按照不同的经济活动或产业部门来划分和统计碳排放量。 按省市县整理成面板数据,其中包括电力行业、工业过程、工业燃烧、建筑物能源、浪费、农业、燃料能源和运输八种指标排放量各省市县的最大值、最小值、平均值、总和。 数据名称:省市县分行业碳排放月度数据 数据年份:2023年 ## 02、相关数据 name 指标 时间 数值 更多数据 ## 03、数据截图
基于OpenCV 相机校准 姿势估计 线性几何 立体图像的深度图
电力系统潮流计算标准算例库:涵盖多种格式与节点拓扑图的数据集(从3节点至300节点),电力系统潮流计算标准算例库:涵盖多种格式与节点拓扑图的数据集(从3节点至300节点全量收录),电力系统潮流计算标准算例的数据(从3节点到300节点都齐了)。 包含IEEE格式、BPA格式、清华格式,同时有各个节点的拓扑图 ,关键词:电力系统;潮流计算;标准算例;数据;节点;IEEE格式;BPA格式;清华格式;拓扑图,电力系统多节点潮流计算标准算例数据及拓扑图解析