单源最短路经(Dijkstra算法的详解)
来源:互联网 发布:dnf进游戏就网络中断 编辑:程序博客网 时间:2024/06/08 04:54
#include<stdio.h>#include<string.h>int n,m;// n 顶点数 m 边数int visit[1001];//visit[Vj] = 1 表示Vj 到源点已是最短的。int countt;// 记录边数int head[1001];// 头结点 存的值是 边所在的位置 head[]的下标为头结点int dist[1001];// 源点到各顶点的最短距离#define INF 999999; // INF 为 无穷大typedef struct EDGE{ int v,w;// w 为边的权值,v 为 弧所指向的顶点 int next;// next 为 边所指向的下一条边所在的位置}EDGE;EDGE edge[2001]; // edge[] 下标为边所在的位置void addedge(int u,int v,int w){ edge[countt].v = v; edge[countt].w = w; edge[countt].next = head[u]; head[u] = countt++;}/** 迪杰斯特拉的思想: 由上述性质可知,如果存在一条从i到j的最短路径(Vi.....Vk,Vj),Vk是Vj前面的一顶点。那么(Vi...Vk)也必定是从i到k的最短路径。为了求出最短路径,Dijkstra就提出了以最短路径长度递增,逐次生成最短路径的算法。譬如对于源顶点V0,首先选择其直接相邻的顶点中长度最短的顶点Vi,那么当前已知可得从V0到达Vj顶点的最短距离dist[j]=min{dist[j],dist[i]+matrix[i][j]}。根据这种思路,假设存在G=<V,E>,源顶点为V0,S={V0},dist[i]记录V0到i的最短距离,path[i]记录从V0到i路径上的i前面的一个顶点。1.从V-S中选择使dist[i]值最小的顶点i,将i加入到S中;2.更新与i直接相邻顶点的dist值。(dist[j]=min{dist[j],dist[i]+matrix[i][j]})3.知道S集合=V集合,停止。**/// 单源最短路经void Dijkstra(int start){ for(int i = 1;i <= n;i++){ dist[i] = INF;// 初始化源点到各顶点的距离为无穷大 } for(int eg = head[start];eg!=-1;eg = edge[eg].next){ int v = edge[eg].v; dist[v] = edge[eg].w;// 若 从源点到 Vj 上有弧,则dist[Vj] = 弧上的权值 } visit[start] = 1;// visit[] = 1 的点表示在 S 集合中的店 dist[start] = 0;// 源点到源点的距离为 0 int minNode; for(int i = 1;i <= n-1;i++){ // 遍历n - 1 次; 找到其余n-1 个点到源点的最短距离 int minn = INF; for(int j = 1;j <= n;j++){// 找到dist[] 里的最小值,并且是在V-S集合中的点 if(!visit[j]&&minn > dist[j]) {minn = dist[j];minNode = j;} } visit[minNode] = 1; //将找到的点纳入S集合中 for(int eg = head[minNode];eg!=-1;eg = edge[eg].next){ int p = edge[eg].v; if(!visit[p]&&(minn+edge[eg].w)<dist[p]) {//更新dist当前最短路径 dist[p] = minn+edge[eg].w; } } }}int main(){ printf("先输入顶点数,后边数:\n"); while(scanf("%d%d",&n,&m)){ countt = 0; for(int i = 1;i <= n;i++){ head[i] = -1;// 初始化各顶点 所指向的边的位置为-1 } int u,v,w;// 相邻的u ,v 顶点 w 为边的权值 for(int i = 1;i <= m;i++){ scanf("%d%d%d",&u,&v,&w); addedge(u,v,w); } int start;// 源点 printf("输入源点:"); scanf("%d",&start); memset(visit,0,sizeof(visit)); Dijkstra(start); for(int i = 1;i <= n;i++){ printf("%d点到%d的距离为%d\n",start,i,dist[i]); } }}
0 0
- 单源最短路经(Dijkstra算法的详解)
- 单源最短路经的迪杰斯特拉算法(Dijkstra)
- Dijkstra 算法次短路经的若干应用
- 最短路经算法简介(Dijkstra算法,A*算法,D*算法)(转载)
- 最短路经算法简介(Dijkstra算法,A*算法,D*算法)(转载)
- 最短路经算法简介(Dijkstra算法,A*算法,D*算法)
- 最短路经算法简介(Dijkstra算法,A*算法,D*算法)
- 单源最短路经
- 最短路dijkstra算法详解:dijkstra(图解)(详
- perl路经详解
- 单源最短路径问题之Dijkstra算法详解
- Dijkstra Algorithm 算法详解
- Dijkstra算法详解
- Dijkstra算法详解
- dijkstra算法详解
- Dijkstra算法详解
- Dijkstra算法详解
- Dijkstra算法详解:
- LEETCODE: Unique Binary Search Trees
- 获取视频大小Byte
- 输入一个无符整形数,将它的二进制位倒序然后输出倒序后所对应的数
- Win7下如何创建odbc数据源
- Unix 常用命令
- 单源最短路经(Dijkstra算法的详解)
- MySQL批量删除表
- BioID人脸数据库简介
- C++Primer学习笔记5 表达式
- 2014年12月28日,我的linux笔记。
- 浏览器缓存机制 与 CDN-内容推送网络
- 每一对顶点之间的最短路径(Floyd弗洛伊德算法)
- 第三天
- 数据结构 归并排序-逆序数对