prim求最短路径C语言,[图论]Prim算法求最小支撑树和最短路径

这个是以前所学,现在总结成博文一篇。

对于图论中的求解最小支撑树问题和最短路径问题都有比较经典的算法,比如最小支撑树可以采用“破圈法”,求解最短路径可以用“Dijkstra算法”。这里笔者将回顾下求解最小支撑树的Prim算法和最短路径算法。

1、Prim算法求解最小支撑树

例1:用Prim算法求解图1的一个最小支撑树。

0818b9ca8b590ca3270a3433284dd417.png

图1:例图

首先,给出Prim算法:

0818b9ca8b590ca3270a3433284dd417.png

实现的C语言代码如下:

#include

int matrix[100][100];

int E[100]={0},tree[100][100]={0};

int n,i,j;

void inputmatrix()

{

printf("请输入邻接矩阵的阶数:\n");

scanf("%d",&n);

printf("请输入邻接矩阵:\n");

for(i=0;i

{

for(j=0;j

scanf("%d",&matrix[i][j]);

}

}

void caculate(int n,int a[100][100])

{

int k=n-1,t=0,t1,t2,min,j,m=1,flag=1;/*k,k1作为循环的次数,flag标记是否有支撑树*/

E[0]=1; /*先放入一个点*/

tree[0][0]=a[0][0];

while(k--)

{

min=100000;

for(j=0;j

{

for(i=0;i

if(E[i]==1&&E[j]==0&&min>a[i][j]&&a[i][j]!=0) /*寻找符合条件的数*/

{

t1=j;

t2=i;

min=a[i][j];

}

}

E[t1]=1; /*标记为1,代表已经用过*/

tree[t2][t1]=a[t2][t1]; /*记录值*/

tree[t1][t2]=a[t1][t2]; /*记录值*/

m++;

}

for(i=0;i

{

if(E[i]==0)

{

printf("没有支撑树\n");

flag=0;

break;

}

}

if(flag==1) /*证明存在支撑树*/

{

printf("输出对应的最小支撑树所对应的矩阵:\n");

for(i=0;i

{

for(j=0;j

printf("%d ",tree[i][j]);

printf("\n");

}

}

}

main()

{

inputmatrix();

caculate(n,matrix);

system("pause");

}

针对图1的例子,我们输入数据求得结果:

0818b9ca8b590ca3270a3433284dd417.png

2、改进的Prim算法求解最短路径

例2:利用改进的Prim算法求解图2的最短路径问题。

0818b9ca8b590ca3270a3433284dd417.png

图2:例图

首先给出该算法的描述。

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

下面是该算法的C语言实现。

#include

int matrix[100][100];

int E[100]={0},distance[100]={0};

int path[100][100] = {0};//初试为空,记录path

int n,i,j,ini;//ini为初始下标

char temp[100];

void inputmatrix()

{

printf("请输入邻接矩阵的阶数:\n");

scanf("%d",&n);

printf("请输入有向图的邻接矩阵(输入0代表无穷大):\n");

for(i=0;i

{

for(j=0;j

scanf("%d",&matrix[i][j]);

}

printf("请输入需计算的起始点下标:\n");

scanf("%d",&ini);

E[ini-1]=1;

path[ini-1][0]=ini;

}

void caculate(int n,int a[100][100])

{

int k=n-1,t=0,t1,t2,min,j,m=1,w,flag=0;/*k,k1作为循环的次数,flag=1意味着可以继续循环,flag=0,跳出*/

while(k--)

{

min=100000;

flag=0;// 初始化

for(j=0;j

{

for(i=0;i

if(E[i]==1&&E[j]==0&&min>(a[i][j]+distance[i])&&a[i][j]>0) /*寻找符合条件的数*/

{

flag=1;// 标记为1,找到!继续循环

t1=j;

t2=i;

min=a[i][j]+distance[i];

}

}

if(flag==0)

break;//跳出

distance[t1]=min;

E[t1]=1; /*标记为1,代表已经用过*/

for(j=0;j

{

if(path[t2][j]!=0)

{

path[t1][j]=path[t2][j];

}

else

{

path[t1][j]=t1+1;

break;

}

}

m++;

}

printf("\n\n----下面为反圈法(prim法)计算结果----\n\n",ini,i+1,distance[i]);

for(i=0;i

{

if(E[i]==1)

{

printf("点%d到点%d的最小距离:%d\n",ini,i+1,distance[i]);

printf("其最短路径:");

for(j=0;j

{

if(path[i][j]!=0)

{

printf("v%d ",path[i][j]);

}

else break;

}

printf("\n");

}

else

printf("点%d到点%d没有路可通!\n\n",ini,i+1);

}

}

main()

{

inputmatrix();

caculate(n,matrix);

system("pause");

}

针对图2,给出运行结果:

0818b9ca8b590ca3270a3433284dd417.png

笔者水平有限,难免有不足,请批评指正!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/573534.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

后台服务器端技术点(前沿了解)

1. OpenResty nginx lua 模式解决 高性能与开发效率 平衡。转载于:https://www.cnblogs.com/jhj117/p/5520250.html

pycharm镜像源_pycharm安装第三方库

点击蓝字关注我们hello,大家好,我是你们的小编大飞。小编一直在学习编程语言,挑选了很久之后决定入了python的坑(bushi)。而python之所以火,是因为它专注于如何解决问题、自由开放的社区环境以及丰富的第三方库。几乎可以这么说&a…

c语言实验指导,C语言实验指导

c语言实验用说,分享快乐!!!!《C语言程序设计》实验指导一、教师指导的实验实验1 (1)C语言上机指南和Visual C 6.0 的基本用法1. 实验目的了解VC开发环境。熟练掌握程序的基本开发过程。 掌握简单程序的设计。2. 实验内容和步骤 2.1. 进入C工作环境建立个人子目录:第…

JAVA并发七(多线程环境中安全使用集合API)

在集合API中,最初设计的Vector和Hashtable是多线程安全的。例如:对于Vector来说,用来添加和删除元素的方法是同步的。如果只有一个线程与Vector的实例交互,那么,要求获取和释放对象锁便是一种浪费,另外在不…

iptables nat表含义_十(4)iptables语法、iptables filter表小案例、iptables nat表应用

iptables语法filter表:INPUT链:作用于进入本机的包OUTPUT链:作用于送出本机的包FORWARD链:作用于和本机无关的包nat表:PREROUTING链:作用是包在刚刚到达防火墙时改变包的目标地址OUTPUT链:改变本…

c语言Max错误,C语言编程常见错误.pdf

C 语言常见错误版权声明:以下内容来自互联网C 语言的最大特点是:功能强、使 方便灵活。C 编译的程序对语法检查并不象其它高级语言那么严格,这就给编程人员留下 “灵活的余地”,但还是由于这个灵活给程序的调试带来了许多不便&…

算法训练 连续正整数的和

问题描述78这个数可以表示为连续正整数的和&#xff0c;123&#xff0c;18192021&#xff0c;252627。输入描述输入一个正整数 n(<10000)输出描述输出 m 行(n有m种表示法)&#xff0c;每行是两个正整数a&#xff0c;b&#xff0c;表示a(a1)...bn。对于多种表示法&#xff0c…

android libev 编译,libev-4.20编译安装及简单使用

1.源码下载地址:链接&#xff1a;https://pan.baidu.com/s/1fxotILo3oTMC65z4qFAh9Q 密码&#xff1a;oc312.库的编译与安装解压文件&#xff0c;进入文件目录编译的时候需要首先切换为管理员(root)账户&#xff0c;然后执行以下命令&#xff1a;./configuremakemake install编…

android系统源码的环境下用make来编译,Android源码编译系统入门

做过 Android 平台开发的朋友对make&#xff0c;mm或make clean命令应该很熟悉&#xff0c;但也许大家只是熟知这些命令的作用却不知道这些命令底下有些什么原理&#xff1f;那么今天我就带着大家推开Android编译系统的大门&#xff0c;探索一下这片未知的恐怖之森(问啥要用恐怖…

bootsrap 外边距_Bootstrap CSS 概览

Bootstrap CSS 概览在这一章中&#xff0c;我们将讲解 Bootstrap 底层结构的关键部分&#xff0c;包括我们让 web 开发变得更好、更快、更强壮的最佳实践。HTML 5 文档类型(Doctype)Bootstrap 使用了一些 HTML5 元素和 CSS 属性。为了让这些正常工作&#xff0c;您需要使用 HTM…

jstl表达式替换某些字符

转自:http://www.yiibai.com/jsp/jstl_function_replace.html fn:replace() 函数替换一个字符串与另一个字符串的所有匹配。 语法 fn:replace () 函数语法如下&#xff1a; boolean replace(java.lang.String, java.lang.String, java.lang.String) 例子&#xff1a; 下面是一个…

android socket 闪退,android客户端闪退

老师&#xff0c;我把客户端的代码放在android程序里&#xff0c;给一个button监听事件&#xff0c;就是调用这个socket方法&#xff0c;但是一点button就闪退了&#xff0c;没连接上~protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState)…

(mac)阿里云ECS服务器配置过程

-----首先本人是半只脚入门的iOS开发者&#xff0c;弄这个只是单纯想多学点东西。 -----阿里云服务器的配置选择&#xff1a;既然是学习用的&#xff0c;最最基础的配置就行了。1M带宽&#xff0c;1核1G...这就不详述了。没啥可选的&#xff0c;&#xff08;其中有个创建实例&a…

android 换到iphone,从安卓换到苹果到底是什么感受?最后一个让我彻底放弃了iPhone!...

原标题&#xff1a;从安卓换到苹果到底是什么感受&#xff1f;最后一个让我彻底放弃了iPhone&#xff01;iPhone X是近几年来苹果最具创新力的iPhone&#xff0c;然而高昂的售价让很多消费者望而却步。随着今年苹果秋季新品发布会的临近&#xff0c;苹果即将发布价格更低廉&…

mac谷歌浏览器怎么登陆账户_mac怎么下chrome浏览器

mac怎么下chrome浏览器&#xff1f;首先打开Safari浏览器百度搜一下谷歌浏览器官网&#xff0c;进入官网页面下载或者也可以直接打开下面的网址进入官网https://www.google.cn/intl/zh-CN/chrome/点击网页上的”下载Chrome“弹出提示&#xff0c;选择”接受并安装“等待软件下载…

php 5.5 xhprof for windows

今天看到一个好的性能优软件xhprof&#xff08;有facebook开发的类库)在国内找了很多网站都没有找到相关php5.5的扩展&#xff0c;只好FQ还是外面的世界精彩一下就找到了link (http://windows.php.net/downloads/pecl/releases/xhprof/0.10.6/)如果不能FQ的小伙伴可以到我的百度…

鸿蒙分布式体验,一张图看懂鸿蒙OS 2.0 分布式能力升级构筑全场景体验

原标题&#xff1a;一张图看懂鸿蒙OS 2.0 分布式能力升级构筑全场景体验【手机中国新闻】9月10日下午&#xff0c;华为召开HDC2020大会&#xff0c;全新的HarmonyOS 2.0正式发布。新系统的分布式能力全面升级&#xff0c;同时还为开发者提供了完整分布式设备与应用开发生态&…

怎么卸载python 旧版本_Python 如何移除旧的版本特性,如何迎接新的特性?

2020 年 4 月 20 日&#xff0c;Python 2 的最后一个版本 2.7.18 发布了&#xff0c;这意味着 Python 2 是真正的 EOL(end of life)了&#xff0c;一个时代终于落幕了。Python 2.0 版本是在 2000 年发布的&#xff0c;至今正好到 20 周年(差半年)&#xff0c;一代版本竟然持续了…

如何在android模拟器中安装apk

1. 启动android模拟器 2. 将要安装的apk&#xff0c;拷贝在与adb.exe同文件夹中。我的路径&#xff1a;D:\android\android-sdk-windows\platform-tools 3. 在cmd中&#xff0c;进入上目录&#xff0c;输入adb install xxx.apk&#xff0c;最后可看见success 4. 回到android模拟…

android 本地图片分享,Android 把图片保存到本地相册

【实例简介】把图片保存到本地相册,实现本地相册资源同步化【实例截图】【核心代码】Scanner└── Scanner├── AndroidManifest.xml├── bin│ ├── AndroidManifest.xml│ ├── classes│ │ └── com│ │ └── housheng│ │ └── scanner│…