一步一步写算法(之prim算法 中)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
C)编写最小生成树,涉及创建、挑选和添加过程
MINI_GENERATE_TREE* get_mini_tree_from_graph(GRAPH* pGraph)
{MINI_GENERATE_TREE* pMiniTree;DIR_LINE pDirLine;if(NULL == pGraph || NULL == pGraph->head)return NULL;pMiniTree = (MINI_GENERATE_TREE*)malloc(sizeof(MINI_GENERATE_TREE));assert(NULL != pMiniTree);memset(pMiniTree, 0, sizeof(MINI_GENERATE_TREE));pMiniTree->node_num = 1;pMiniTree->pNode = (int*)malloc(sizeof(int) * pGraph->count);memset(pMiniTree->pNode, 0, sizeof(int) * pGraph->count);pMiniTree->pNode[0] = pGraph->head->start;while(1){memset(&pDirLine, 0, sizeof(DIR_LINE));get_dir_line_from_graph(pGraph, pMiniTree, &pDirLine);if(pDirLine.start == 0)break;pMiniTree->line_num ++;insert_line_into_queue(&pMiniTree->pLine, pDirLine.start, pDirLine.end, pDirLine.weight);insert_node_into_mini_tree(&pDirLine, pMiniTree);}return pMiniTree;
}
d) 构建挑选函数,选择最合适的边
void get_dir_line_from_graph(GRAPH* pGraph, MINI_GENERATE_TREE* pMiniTree, DIR_LINE* pDirLine)
{DIR_LINE* pHead;DIR_LINE* prev;VECTEX* pVectex;LINE* pLine;int index;int start;pHead = NULL;for(index = 0; index < pMiniTree->node_num; index++){start = pMiniTree->pNode[index];pVectex = find_vectex_in_graph(pGraph->head, start);pLine = pVectex->neighbor;while(pLine){insert_line_into_queue(&pHead, start, pLine->end, pLine->weight);pLine = pLine->next;}}if(NULL == pHead)return;delete_unvalid_line_from_list(&pHead, pMiniTree);if(NULL == pHead)return;sort_for_line_list(&pHead);memmove(pDirLine, pHead, sizeof(DIR_LINE));while(pHead){prev = pHead;pHead = pHead->next;free(prev);}return;
}
e)添加节点函数,将尚不是最小生成树的点纳入到最小生成树当中去
void insert_node_into_mini_tree(DIR_LINE* pLine, MINI_GENERATE_TREE* pMiniTree)
{int index;for(index = 0; index < pMiniTree->node_num; index ++){if(pLine->start == pMiniTree->pNode[index]){pMiniTree->pNode[pMiniTree->node_num++] = pLine->end;return;}}pMiniTree->pNode[pMiniTree->node_num++] = pLine->start;return;
}
注意事项:
(1)d、e是c中调用的子函数,如果大家观察一下就明白了
(2)最小生成树是按照自顶向下的顺序编写的,虽然c中的子函数完成了,但是d中还有两个子函数没有着落
(3)d中的函数delete_unvalid_line_from_list、sort_for_line_list会在下一篇中继续介绍
(4)算法只要能够按照手工计算的流程编写出来,基本上问题不大,但是一些细节还是要小心注意的
【待续】
一步一步写算法(之prim算法 中)相关推荐
- Kruskal 算法与 Prim 算法
一:无向带权图的最小生成树 无向带权图是图论算法领域中的一种基础模型.它的代码实现我们就不在这篇文章中介绍了,大家可以参考文章后面给出的代码链接.下图为一个无向带权图的示例: 接下来我们着重介绍一下图 ...
- 学习进度2012-6-26(动态规划算法、Prim算法、Dijkstra算法)
今天学习下三个算法:动态规划算法.Prim算法.Dijkstra算法,将自己理解的逻辑略作总结. 1.动态规划算法是选取两个字符串的最长子序列的解法作为切入点学习,在公司午休时间将代码写了下,初步测试 ...
- 最小生成树:Kruskal算法 和 Prim算法(第23章)
武侠: 飞雪连天射白鹿,笑书神侠倚碧鸳. --金庸十四著作 飞狐外传 .雪山飞狐 .连城诀 .天龙八部 .射雕英雄传 .白马啸西风 .鹿鼎记 .笑傲江湖 .书剑恩仇录 .神雕侠侣 .侠客岛 .倚天屠龙 ...
- Kruskal算法与Prim算法
(话说这么些算法的名字嗯... Kruskal算法:(下文它就暂时叫k算法吧 k算法是一种应用贪心思想及并查集,在图中查找最小生成树的算法. (最小生成树:若一个无向图内任意两个顶点联通切图为一棵树, ...
- 普里姆算法(Prim算法)
普里姆算法(Prim算法) 简介 普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex ...
- 【算法】prim算法(最小生成树)(与Dijkstra算法的比较)
最小生成树: 生成树的定义:给定一个无向图,如果它的某个子图中任意两个顶点都互相连通并且是一棵树,那么这棵树就叫做生成树.(Spanning Tree) 最小生成树的定义:在生成树的基础上,如果边上有 ...
- 转 最小生成树(kruskal 算法 和prim算法)
链接:http://blog.csdn.net/weinierbian/article/details/8059129/ 给定一个带权的无向连通图,如何选取一棵生成树,使树上所有边上权的总和为最小,这 ...
- * poj 1251 JungleRoad 最小生成树 Kruskal算法、Prim算法
文章目录 Kruskal算法 模板:https://blog.csdn.net/Rain722/article/details/65642992 Prim算法 模板: poj 1251 JungleR ...
- 贪心算法之prim算法
算法思想: 首先置S={1},然后只要S是V的真子集,就做如下的贪心选择:选择满足条件i属于S,j属于V-S,且edge[i][j]是最小的边,就将其顶点j添加到S中,这个过程一直进行到S=V时为止, ...
- day38--Dijkstra 算法与 Prim 算法
两个算法的结构相同,代码部分大致相同,这两个算法的核心是三个数组,tempDistanceArray记录距离 ,tempParentArray记录上一个节点,tempVisitedArray记录是否被 ...
最新文章
- 三十天学不会TCP,UDP/IP网络编程-TraceRoute的哲学
- 分组,命名分组,url的命名和反向解析
- Spring的AOP-底层原理
- windows传文件到linux服务器--- secureCRT PK xftp
- 二分图匹配的判断+p1322+二分图最大匹配+tyvj1035
- 【apicloud问题解决记录】键盘弹出监听处理以及头部底部的黑色闪屏现象
- 编译easymule 1.1.5
- linux arm sbus,嵌入式ARM系列linux2.4配置makefile完全注释(2)
- 使用C++实现n阶行列式的计算
- Win10连接NAS网络存储器失败解决方法
- python简单游戏——打气球
- SQLSTATE=08S01通讯连接失败
- 天平游码读数例题_天平游码怎么读数?
- 使用信用卡 要避开这些陷阱
- 人工智能英文缩写怎么读,人工智能英文缩写大全
- 关于征集全国信标委人工智能分委会知识图谱工作组成员单位的通知
- 【学习图像处理】之实验二——灰度图像直方图规定化
- [Outlook] outlook如何实现自动CC和BCC邮件发送
- CUDA编程(一) —— 相关概念基础知识
- 【简历上如何介绍自己的项目?】