最短路算法之Dijkstra算法

来源:互联网 发布:淘宝售后客服热线 编辑:程序博客网 时间:2024/05/17 02:21

目标算法:Dijkstra算法

应用范围:最短路

 

算法代码:

#include<cstdio>#include<iostream>using namespace std;const int maxn = 205;const int Inf = 0x3f3f3f;int map[maxn][maxn];int dis[maxn];int vis[maxn];int n,m;int x,y,z;void mapinit(){    for(int i=0;i<n;i++)    {        for(int j=0;j<n;j++)        {            if(i == j)                map[i][j] = 0; //自己到自己的距离为0            else                map[i][j] = Inf; //初始化为一个足够大的数来判断最后是否能到达        }    }} //初始化邻接矩阵void Arrayinit(int start){    for(int i=0;i<n;i++)    {        dis[i] = map[start][i];        vis[i] = 0;    }}// 初始化访问数组和dis数组int Dijkstra(int start,int end){    Arrayinit(start);    vis[start] = 1;    for(int i=0;i<n;i++)    {        int Min = Inf;        int flag;        for(int j=0;j<n;j++)        {            if(dis[j] < Min && !vis[j])            {                flag = j;                Min = dis[j];            }        }        vis[flag] = 1;        for(int j=0;j<n;j++)        {            if(map[flag][j]+dis[flag] < dis[j] && !vis[j])                dis[j] = map[flag][j] + dis[flag];        }    }    if(dis[end] == Inf) // 如果终点距离为Inf,则说明无法到达终点,返回-1        return -1;    else        return dis[end];} // 迪杰斯特拉算法int main(){    while(~scanf("%d%d",&n,&m))    {        mapinit();        int start,end;        for(int i=1;i<=m;i++)        {            scanf("%d%d%d",&x,&y,&z);            if(map[x][y] > z)                map[x][y] = map[y][x] = z; //两个节点之间可能存在多条边,选择其中最小的进行储存        }         scanf("%d%d",&start,&end);         int ans = Dijkstra(start,end);         printf("%d\n",ans);    }    return 0;}


0 0
原创粉丝点击