Dijkstra算法
Dijkstra算法是在贪心思想上实现的。 首先,保存起点到所有点的距离寻找最短的,然后,松弛一次再找到最短的。 松弛操作是指把刚才找到的距离最短的点作为中继站巡视一遍看是否更近,如果更近则更新距离,从而保存从寻找所有点到其他点的最短距离
问题部署:
指定到其馀每个顶点的点(源点)的最短路径。 也称为“单源最短路径”。 例如,求出从下图的第一顶点到第2、3、4、5、6顶点的最短路径。
让我们来模拟一下:
这是戴克斯特拉法的基本理念:
接下来是代码:
我们将一些流程封装在基本模块中:
# include cstdio # include cstring # include algorithm # include iostream # define INF0x3F3 F3 fusingnamespacestd; int map[1005][1005]; int vis[1005],dis[1005]; int n,m; //n个点,m条边void init ((memset ) map,Inf,sizeof ) ) map ); for(intI=1; i=n; I ) {map[i][i]=0; }}void Getmap () {int u,v,w; for(intt=1; t=m; t )扫描(' % d % d % d )、u、v、w ); if(map[u][v]w ) { map[u][v]=w; map[v][u]=w; }}voidDijkstra(intu ) memset ) vis,0,sizeof ) vis ); for(intt=1; t=n; t({dis[t]=map[u][t]; }vis[u]=1; for(intt=1; tn; t ) {int minn=Inf,temp; for(intI=1; i=n; I ) if (! vis[I]dis[I]minn({minn=dis[I]; temp=i; }}vis[temp]=1; for(intI=1; i=n; I () if )地图[ temp ] [ I ] dis [ temp ] dis [ I ] ) { dis [ I ]=地图[ temp ] [ I ] dis [ temp ]; }}}}int main () scanf ) ' %d%d ',m,n ); Init (; 获取图(; Dijkstra(n; printf(%d(n ),dis[1]; 返回0; }