dijkstra算法个人感觉挺怪异的,不过复杂度O(n2),速度快,但是不能理解WSM很多人都推荐用FLOYD,可能是实现简单吧,但是FLOYD必须用邻接矩阵来实现。两者的功能上稍有不同,dijkstra算法对于输入的节点,能够找出该点到所有其他点的最短路径。
基本的算法思路是,把图中的点集分为2部分,一部分为访问过的点(即已经找到了输入点到该点的最短路径),另一部分为还没访问到的点。dijkstra算法的进行过程就是把第二类点归并到第一类点的过程。
如何归并,首先在第二类点中找到距输入点(v)距离最近的点(i),把这个点归入第一类,然后开始更新其余第二类点到输入点的距离(即如果dist[i]+cost[i][j]<dist[j],dist[j]=dist[i]+cost[i][j],cost为邻接矩阵中的权值,点j是更新的节点)。
可以看出,没归并更新一次,第一类点就曾加一个,第二类点就少一个,那么我们初始化时将第一类点集设为空,所有的点全在第二类点集中。只需经过NUMV次归并更新操作,即可找到从输入点到所有点的最短路径。
基本的算法思路是,把图中的点集分为2部分,一部分为访问过的点(即已经找到了输入点到该点的最短路径),另一部分为还没访问到的点。dijkstra算法的进行过程就是把第二类点归并到第一类点的过程。
如何归并,首先在第二类点中找到距输入点(v)距离最近的点(i),把这个点归入第一类,然后开始更新其余第二类点到输入点的距离(即如果dist[i]+cost[i][j]<dist[j],dist[j]=dist[i]+cost[i][j],cost为邻接矩阵中的权值,点j是更新的节点)。
可以看出,没归并更新一次,第一类点就曾加一个,第二类点就少一个,那么我们初始化时将第一类点集设为空,所有的点全在第二类点集中。只需经过NUMV次归并更新操作,即可找到从输入点到所有点的最短路径。
#include<iostream> #include<string.h> using namespace std; const int numv=6; const int maxm=100000; int dist[numv]; int path[numv]; int s[numv]; int cost[numv][numv]; int init() { for(int i=0;i<numv;i++) { path[i]=-1; s[i]=0; } for(int i=0;i<numv;i++) for(int j=0;j<numv;j++) cost[i][j]=maxm; //cost[0][0]=0; cost[0][2]=10; cost[0][4]=30; cost[0][5]=100; //cost[1][1]=0; cost[1][2]=10; //cost[2][2]=0; cost[2][3]=50; //cost[3][3]=0; cost[3][5]=10; //cost[4][4]=0; cost[4][3]=20; cost[4][5]=60; //cost[5][5]=0; } void getShotpath(int v) { for(int i=0;i<numv;i++) { dist[i]=cost[v][i]; s[i]=0; if(cost[v][i]<maxm) path[i]=v; else path[i]=-1; } s[v]=1; dist[v]=0; for(int i=0;i<numv;i++) { int min=100000; int flag; for(int j=0;j<numv;j++) { if(!s[j]&&dist[j]<min) { min=dist[j]; flag=j; } } s[flag]=1; //cout<<min<<endl; for(int j=0;j<numv;j++) { if(!s[j]&&dist[flag]+cost[flag][j]<dist[j]) { dist[j]=dist[flag]+cost[flag][j]; path[j]=flag; } } } } int main() { int a,b; while(cin>>a>>b) { if(a==b) cout<<"input again"<<endl; if(a>5||b>5) cout<<"input again"<<endl; init(); getShotpath(a); cout<<"shotpath="<<dist[b]<<endl; int k=b; int pout[maxm]; int count=0; while(path[k]!=-1) { pout[count]=path[k]; k=path[k]; ++count; } for(int i=count-1;i>=0;i--) cout<<pout[i]<<" "; cout<<b<<" "; cout<<endl; } }
发表评论
-
图的割点tarjan---zoj_1119
2011-10-24 23:00 1261http://acm.zju.edu.cn/on ... -
BFS与双向BFS---zoj_1505
2011-10-09 17:14 1676http://acm.zju.edu.c ... -
静态treap+线段树---zoj_2112
2011-09-29 23:06 1734http://acm.zju.edu ... -
NIM博弈游戏,SG函数---zoj_3084,zoj_2083
2011-09-23 23:00 1340Nim游戏是两个人进行的游戏有如下规则: ... -
多重背包--zoj_2156
2011-09-14 11:10 893首先介绍经典的三种背包问题,0-1背包,完全 ... -
模式串匹配---KMP
2011-08-31 20:49 1307朴素的的模式串匹配算法通常要在向前移动文本指针 ... -
八数码问题(A*&&双向BFS)---zoj_1217
2011-08-30 22:13 1702题目地址:http://acm.zju.edu.cn/onli ... -
ac自动机以及它上面的DFA
2011-08-08 23:04 2527AC自动机(Aho-Corasick)主要用 ... -
二分图最大匹配(匈牙利算法)--zoj1516,1525,2223
2011-07-20 22:36 1209二分图G(E,V)将点集合V分成两个部分L,R ... -
网络最大流(EK)---zoj_1734
2011-07-19 16:34 2179网络最大流是图论中的一个典型问题,为了精确的定 ... -
trie和前缀检查---zoj_2876
2011-07-13 23:03 890trie树是一种多叉树,广泛用于字典检索。如 ... -
位图bitmap
2011-07-13 21:08 948bitmap是一种广泛使用的数据结构,主要用在 ... -
LAC和RMQ的转化---zoj_3195
2011-07-12 22:35 1103我擦。。纠结了好久啊,从SF到TLE,先总结2 ... -
LAC的tarjan(离线)算法---zoj_1141
2011-07-08 17:52 1690LCA就不解释了,这里主要再次复习一下LC ... -
笛卡尔树以及treap---zoj_2243
2011-07-07 15:52 2886zoj_2243笛卡 ... -
线段染色,矩形切割,离散化---zoj_2301,zoj_1128
2011-06-24 22:32 1409染色问题:在一维坐标轴上(最右端为M),有N ... -
线段树---zoj_1610
2011-06-22 21:06 786线段树是一种二叉树的拓展,在线段树每个节点中 ... -
快速排序(qsort)
2011-06-16 17:03 799快速排序是一种高效的非稳定排序,它的基本思路 ... -
斐波那契散列
2011-06-16 16:38 3108斐波那契散列法其实是一种特殊的乘法散列,先来看乘法 ... -
强连通分支(scc)---tarjan
2011-06-15 16:17 1311本文大量 ...
相关推荐
"用Dijkstra算法求图中单源最短路径" Dijkstra算法是一种常用的图搜索算法,用于解决单源最短路径问题。单源最短路径问题是指从一个出发顶点到所有可达顶点的最短路径问题。Dijkstra算法的原理是通过将图中的每个...
【部分内容】中具体介绍了Dijkstra算法,这是解决单源最短路径问题的经典算法。Dijkstra算法的核心思想是维护一个集合S,集合S中的顶点代表已经找到从源节点到这些顶点最短路径的节点。算法初始时,S仅包含源节点,...
用C++实现的贪心算法 Dijkstra 单源最短路径,并包含大量的注释,对理解程序很有帮助
单源最短路径Dijkstra模板 Dijkstra算法是一种常用的图算法,用于解决单源最短路径问题。该算法的基本思想是,通过维护一个距离数组,记录从源节点到其他所有节点的最短距离,并不断更新这些距离,使得它们变得...
实验目的:理解贪心法的核心思想、贪心法的求解过程,并从算法分析与设计的角度,对单源最短路径问题的 Dijkstra 算法求解有进一步理解。 实验内容: 1. 问题描述:给定一个有向带权图 G=(V,E),其中每条边的权是...
本篇文章将深入探讨单源最短路径的概念、Dijkstra算法的原理,并通过一个具体的Java实现案例来理解其实际应用。 #### 单源最短路径概念 单源最短路径问题旨在找到一个加权图中从给定源节点到其余所有节点的最短...
Dijstra算法用于求解单源最短路径问题,即在图中求出给定顶点到其它任一顶点的最短路径。
### Dijkstra算法实现单源最短路径问题 #### 算法原理 Dijkstra算法是一种用于寻找图中两点之间的最短路径的经典算法。它适用于所有边权重非负的情况,并且可以高效地解决单源最短路径问题。在该问题中,我们需要...
DIJKSTRA单源最短路径算法C/C++实现,内有注释,输入邻接矩阵,输入源点到终点最短路径长度。
Dijkstra算法是最常用的求解单源最短路径的贪心算法之一,由荷兰计算机科学家艾兹格·迪科斯彻于1956年提出。这个算法适用于加权有向图或无向图,其基本思想是每次扩展最短路径树,将当前未访问且与已访问节点距离...
迪杰斯特拉(Dijkstra)算法是一种用于寻找有向图中单源最短路径的经典算法,由荷兰计算机科学家艾兹格·迪杰斯特拉在1956年提出。在这个算法中,我们从一个源节点开始,逐步扩展最短路径到其他节点,直到到达所有...
Dijkstra算法是一种常用的单源最短路径算法,用于解决带权有向图中的最短路径问题。 单源最短路径问题 单源最短路径问题是指从给定的源顶点s到其它顶点v的权最小路径。该问题可以形式化地描述为:给定一个带权有向...
单源最短路径问题在计算机科学中是一个经典且重要的图论问题,主要目的是找到图中一个指定源节点到其他所有节点的最短路径。这个问题在路由、网络优化、任务调度等多个领域都有广泛应用。本篇文章将深入探讨单源最短...
总的来说,Dijkstra算法是解决单源最短路径问题的基石,Java实现使其能够方便地应用于各种实际场景。通过对`Dijkstra.java`文件的理解和学习,你可以深入掌握这一重要算法,并将其运用到自己的项目中。
### 单源最短路径问题的Dijkstra算法详解 #### 一、算法背景与应用场景 在图论中,单源最短路径问题是指在一个带有非负权重边的有向图或无向图中找到从一个指定顶点(称为源点)到其他所有顶点的最短路径的问题。...
Dijkstra算法是由荷兰计算机科学家艾兹格·迪科斯彻于1956年提出的,主要用于寻找带非负权重的图中单源最短路径。该算法基于贪心策略,每次选取当前未标记且距离源点最近的顶点,并更新与其相邻顶点的距离。它使用...
2. **掌握并实现迪杰斯特拉(Dijkstra)算法,用于解决单源最短路径问题**。 3. **能够熟练使用C++编程语言进行算法的实现,并调试程序**。 4. **学会如何利用数据结构优化算法性能**。 #### 三、实验要求 1. **熟悉...
贪心算法之应用-单源最短路径-Dijkstra算法学习