dijkstra算法--求两点之的最短路径
2016-04-13 14:38
253 查看
# include <stdio.h> # define MAX 20 int creat_cost(int cost[][MAX]) //cost 用来表示图的邻接矩阵 { int arcnum,vexnum,v1,v2,w; printf ("请输入顶点个数和弧数\n"); //输入图的顶点数和弧数 scanf ("%d %d",&vexnum,&arcnum); for (int i=1; i<=vexnum; ++i) { for (int j=1; j<=vexnum; ++j) { cost[i][j] = 9999; //假设9999为无限大 } } for (int k=1; k<=arcnum; ++k) { printf ("请输入两个顶点以及之间的距离\n") printf ("v1,v2,w = "); //输入所有边的一对顶点v1,v2,以及弧长 scanf (" %d %d %d",&v1,&v2,&w); //并且根据输入数据建立邻接矩阵 cost[v1][v2] = w; } return vexnum; } void dijkstra(int cost[][MAX],int vexnum) //dijkstra算法 求最短路径 { int path[MAX],s[MAX],dist[MAX],i,j,n,w,v,sum,min,v1;/* s数组记录顶点v是否已经确定了最短路径 s[v]=1, 顶点v已经确定了最短路径 s[v]=0,顶点v还没有确定最短路径 dist数组表示当前求出的从v1到v2的最短路径 path是路径数组,path[i]表示源点到顶点vi之间最短路径上vi的前驱顶点 */ printf ("输入源点\n"); scanf (" %d",&v1); //输入源点v1 for (i=1; i<=vexnum; ++i) { dist[i] = cost[v1][i]; s[i] = 0; if (cost[v1][i] < 9999) //记录当前最短路径 path[i] = v1; } s[v1] = 1; //将源点加入s数组中 for (i=1; i<=vexnum; ++i) { min = 9999; for (j=1; j<=vexnum; ++j) //从s数组外找出距离源点最近的顶点w { if ((s[j] == 0)&&(dist[j]<min)) { min = dist[j]; w = j; } } s[w] = 1; for (v=1; v<=vexnum; ++v) { if (s[v] == 0) { if (dist[w]+cost[w][v] < dist[v]) { dist[v] = dist[w]+cost[w][v]; //修改v-s集合中各顶点的最短路径长度 path[v] = w; } } } } printf ("从源点 %d 开始的最短路径\n",v1); for (i=1; i<=vexnum; ++i) 997f { if (s[i] == 1) { w = i; while(w != v1) { printf ("%d <--",w); w = path[w]; } printf ("%d ",w); printf (" %d\n",dist[i]); } else { printf ("%d <--%d ",i,v1); printf ("9999\n"); //不存在路径时,路径长度设为9999 } } } int main(void) { int vnum; int cost[MAX][MAX]; vnum = creat_cost(cost); //建立图的邻接矩阵 dijkstra(cost,vnum); return 0; }
相关文章推荐
- mysql5.6,基于GTID的主从同步与延迟复制
- 148. Sort List
- view桌面模板准备注意事项
- 天平称量
- 阿里的两篇不错的关于网页A/B测试的博客
- Java模板引擎
- [leetcode] 12. Integer to Roman 解题报告
- Linux网络编程--recv函数返回值详解
- Hive几种数据导入方式
- eclipse代码注释的设置
- mysql主从的搭建
- 转:阿里 Weex 思路与实战(web相关)
- 移动端网页fixed布局问题解决方案
- SSRS使用MySql作为数据源遇到的问题。
- java-邮件发送接收和删改
- C++文件操作
- spark1.5.2.1小版本制作并上传mave local repo
- 持续集成回顾暨点滴分享[6] – 工具篇,Jenkins终于登场了!
- yepnope.js – 异步加载资源文件
- 冒泡排序、插入排序、交换排序