首页 > 代码库 > 最短路——Dijkstra算法
最短路——Dijkstra算法
模板
水模板ing
#include <cstdio>#include <cstring>#include <algorithm>#include <iostream>#include <queue>#define MAX 9999999using namespace std;int G[203][203];//二维数组 图的存储int n, s, t;//n 点的个数 , s 起点 ,t 终点void dijkstra(){ bool vis[203];//相当于集合Q的功能, 标记该点是否访问过 int dis[203];//保存最短路径 int i, j, k; for(i=0;i<n;i++)//初始化 dis[i] = G[s][i];//s—>各个点的距离 memset(vis,false,sizeof(vis));//初始化为假 表示未访问过 dis[s] = 0;//s->s 距离为0 vis[s] = true;//s点访问过了,标记为真 for(i=1;i<n;i++)//G.V-1次操作+上面对s的访问 = G.V次操作 { k = -1; for(j=0;j<n;j++)//从尚未访问过的点中选一个距离最小的点 if(!vis[j] && (k==-1||dis[k]>dis[j]))//未访问过 && 是距离最小的 k = j; if(k == -1)//若图是不连通的则提前结束 break;//跳出循环 vis[k] = true;//将k点标记为访问过了 for(j=0;j<n;j++)//松弛操作 if(!vis[j] && dis[j]>dis[k]+G[k][j])//该点为访问过 && 可以进行松弛 dis[j] = dis[k]+G[k][j];//j点的距离 大于当前点的距离+w(k,j) 则松弛成功,进行更新 } printf("%d\n",dis[t]==MAX?-1:dis[t]);//输出结果}int main(){ int m, i, j, u, v, w; while(scanf("%d %d",&n,&m)==2) {//获取点的个数 边的个数 for(i=0;i<n;i++) for(j=0;j<n;j++) G[i][j] = i==j?0:MAX;//初始化,本身到本身的距离为0,其他的为无穷大 while(m--){ scanf("%d %d %d",&u,&v,&w);//获取u,v,w(u,v); if(G[u][v]>w)//因为初始化的操作 && 若有重边要去最小的权重值 G[u][v] = G[v][u] = w;//无向图 双向 } scanf("%d %d",&s,&t);//获取起止点 dijkstra(); } return 0;}
最短路——Dijkstra算法
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。