前几天考试,最后一题是有关最小生成树的,但是由于好久没有看数据结构了,把最小生成树和最短路径算法搞混了 (二者本来就很相近)。今天首先写了最小生成树的算法,

然后将其代码复制粘贴,在原来的基础上稍作修改,就变成了最短路径算法。(二者最大的区别应该是对某一个标志数组的更新上,最小生成树是将集合V中的点,更新为到集合U中任意一点的最短距离,而最短路径则是将集合V中点更新为到源点的最短距离)。并且采用了同一个测试用例。

希望对这两种算法模糊的同学起到一定的帮助作用,下面是最小生成树代码

//最小生成树
/*
6
0 6 1 5 0 0
6 0 5 0 3 0
1 5 0 5 6 4
5 0 5 0 0 2
0 3 6 0 0 6
0 0 4 2 6 0
*/#include <stdio.h>
#include<string.h>
#define MAX_SIZE 100int n ;
int closedge[MAX_SIZE];
int min_road(int a[]);int main (){int sum;int i, j ;int G[MAX_SIZE][MAX_SIZE];scanf("%d",&n);for (i = 0 ; i < n ; i ++)for ( j = 0 ; j < n ;  j++){scanf("%d",&G[i][j]);if (G[i][j]==0)G[i][j]=0x7fffffff;}sum  =   MinSpanTree_prim(G , 0);printf("总花费 = %d\n",sum);return 0;}int MinSpanTree_prim(int G[][MAX_SIZE] ,int v){int i,j;int sum = 0 ;//总花费int new_point ;//新节点for ( i = 0 ; i < n ; i ++){closedge[i] = G[v][i];}closedge[v] = 0;printf("%d\n",v);for (i = 1 ; i < n ; i++){new_point = min_road(closedge);//从数组中找出最小的非零边,没有返回-1printf("%d\n",new_point);if (new_point^-1){sum += closedge[new_point] ;closedge[new_point] = 0 ;//加入生成树}else{printf("图不连通\n");}for ( j = 0 ; j < n ; j ++){if (closedge[j] && G[new_point][j]){closedge[j] = G[new_point][j]<closedge[j]?G[new_point][j]:closedge[j];}//  printf(" %d ",closedge[j]);}printf("\n");}return sum;}
int min_road(int a[]){int min = 0x7fffffff ;int v = -1 , i ;for ( i = 0 ;  i< n ; i++){if (closedge[i] && closedge[i]<min){min = closedge[i] ;v = i ;}}return v;}

最短路径算法代码:

//最段路径
/*
6
0 6 1 5 0 0
6 0 5 0 3 0
1 5 0 5 6 4
5 0 5 0 0 2
0 3 6 0 0 6
0 0 4 2 6 0
*/#include <stdio.h>
#include<string.h>
#define MAX_SIZE 100int n ;
int closedge[MAX_SIZE];//记录各点到源点的距离
int visited[MAX_SIZE] ;//记录该点是否已经加入集合V
int min_road(int a[]);int main (){int sum;int i, j ;int G[MAX_SIZE][MAX_SIZE];scanf("%d",&n);for (i = 0 ; i < n ; i ++)for ( j = 0 ; j < n ;  j++){scanf("%d",&G[i][j]);if (G[i][j]==0)G[i][j]=0x7fffffff;}MinSpanTree_prim(G , 0);return 0;}int MinSpanTree_prim(int G[][MAX_SIZE] ,int v){int i,j;//int sum = 0 ;//总花费int new_point ;//新节点for ( i = 0 ; i < n ; i ++){visited[i] = 0;closedge[i] = G[v][i];}closedge[v] = 0;visited[v] = 1;//   printf("%d\n",v);for (i = 1 ; i < n ; i++){new_point = min_road(closedge);//从数组中找出最小的非零边,没有返回-1// printf("%d\n",new_point);if (new_point^-1){visited[new_point] = 1;//加入集合U//  sum += closedge[new_point] ;//closedge[new_point] = 0 ;//加入生成}else{printf("图不连通\n");}for ( j = 0 ; j < n ; j ++){if ( !visited[j] && G[new_point][j]!=0x7fffffff){closedge[j] = (G[new_point][j] + closedge[new_point])<closedge[j]?(G[new_point][j] + closedge[new_point]):closedge[j];//更新集合V中的最短路径}printf(" %d ",closedge[j]);}printf("\n");}// return sum;}
int min_road(int a[]){int min = 0x7fffffff ;int v = -1 , i ;for ( i = 0 ;  i< n ; i++){if (!visited[i] && closedge[i]<min){min = closedge[i] ;v = i ;}}return v;}

由最小生成树算法改到最短路径算法代码----为了区分两者的区别相关推荐

  1. 【JavaScript算法实践】最短路径算法

    目录 前言 一.Dijkstra算法 算法实现 二.Floyd-Warshall 算法 算法实现 前言 最短路问题是图问题中的经典问题,这类问题在生活中非常常见,我们(特别是生活在大城市的人)出门在外 ...

  2. 最小生成树(prime算法、kruskal算法) 和 最短路径算法(floyd、dijkstra)

    带权图分为有向和无向,无向图的最短路径又叫做最小生成树,有prime算法和kruskal算法:有向图的最短路径算法有dijkstra算法和floyd算法. 生成树的概念:联通图G的一个子图如果是一棵包 ...

  3. 最小生成树(prime算法、kruskal算法) 和 最短路径算法(floyd、dijkstra)

    带权图分为有向和无向,无向图的最短路径又叫做最小生成树,有prime算法和kruskal算法:有向图的最短路径算法有dijkstra算法和floyd算法. 生成树的概念:联通图G的一个子图如果是一棵包 ...

  4. 【老生谈算法】matlab实现最短路径算法源码——最短路径算法

    每对顶点之间的最短路径 matlab程序 1.文档下载: 本算法已经整理成文档如下,有需要的朋友可以点击进行下载 序号 文档(点击下载) 本项目文档 [老生谈算法]最短路径的Floyd算法的Matla ...

  5. dijkstra最短路径算法视频_Dijkstra最短路径算法

    示例 伪代码 分析 Dijkstra算法是目前比较主流的计算最短路径的方法,求取一个顶点到其余各顶点的最短路径,也称作单源最短路径.它的主要特点是从起始点开始,采用贪心的策略对点进行遍历,层层遍历(广 ...

  6. Dijkstra(迪杰斯特拉)算法(单源最短路径算法)的理解

    介绍 对于dijkstra算法,很多人可能感觉熟悉而又陌生,可能大部分人比较了解bfs和dfs,而对dijkstra和floyd算法可能知道大概是图论中的某个算法,但是可能不清楚其中的作用和原理,又或 ...

  7. 一本通 第三部分 数据结构 第四章 图论算法 第二节 最短路径算法 1381:城市路(Dijkstra)

    1381:城市路(Dijkstra) 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 2710 通过数: 772 [题目描述] 罗老师被邀请参加一个舞会,是在城市n,而罗老师当前所 ...

  8. 图的最小生成树和最短路径算法思路总结(Prim,Kruskal,Dijkstra,Floyd)

    带权无向图->最小生成树算法->Prim算法: 思路: 首先,我们先设置两个集合,U_{}:一个用来放最小生成树的顶点,T_{}:一个用来放最小生成树的边.选取最开始的点V_0,将V_0放 ...

  9. 【数据结构】最小生成树(Prim算法,普里姆算法,普利姆)、最短路径(Dijkstra算法,迪杰斯特拉算法,单源最短路径)

    文章目录 前置问题 问题解答 一.基础概念:最小生成树的定义和性质 (1)最小生成树(Minimal Spanning Tree)的定义 (2)最小生成树(MST)的性质 二.如何利用MST性质寻找最 ...

最新文章

  1. 2018-3-12论文(非结构网络中有价值信息数据挖掘)笔记二-----作者:关联规则的非结构网络有价值信息数据挖掘(看不懂,看不懂)
  2. 达摩院首席数据库科学家李飞飞:云原生新战场,我们如何把握先机?
  3. TCP/IP状态详解
  4. c++ topk问题
  5. TypeError: iter() returned non-iterator of type
  6. Android中的进程
  7. 内核并发控制---顺序锁 (来自网易)
  8. linux系统中如何安装qwt,在Linux上部署Qt及Qwt
  9. 2011年计算机二级c++笔记:类的转换
  10. 孙鑫VC学习笔记:第一讲 Windows程序内部运行原理
  11. 计算机上已安装某个第三方应用程序,防止电脑第三方软件“被”安装 3招彻底屏蔽不明软件...
  12. mysql 执行顺序_MySQL 基础知识掌握
  13. 2021华为软件精英挑战赛总结
  14. 控制策略 | PI控制器积分分离的仿真分析
  15. 谈程序员的职业发展前景
  16. win2008服务器虚拟内存设置,电脑虚拟内存设置(Win 7/8/10、Windows Server 2003 - 2019)...
  17. 安装 win7虚拟机
  18. python 报价机器人_100行代码实现报价机器人公众号后台
  19. 小米公司在互联网的地位怎么样
  20. 想要申请PhD,真是路漫漫啊

热门文章

  1. 离异美女跟程序员相亲,结果自我介绍完就被秒删:三无送个儿
  2. oracle cur notfound,%notfound的理解——oracle存儲過程 | 學步園
  3. 计算机硬盘共享配额,Win10磁盘配额是什么,怎么用?
  4. 我的世界python写游戏_快来试试Python写的游戏《我的世界》
  5. 监督学习 | SVM 之线性支持向量机原理
  6. 这么做科研你也能成功!
  7. iMeta宏基因组生物信息期刊-创刊背景和简介
  8. ggforce|绘制区域轮廓-区域放大-寻找你的“onepiece”
  9. 国际上首次报道的非人灵长类胰岛衰老的单细胞转录组图谱
  10. 没钱买KEGG怎么办?REACTOME开源通路更强大