Dijkstra算法小笔记

#include <algorithm>
#include <cstring>
#include <iostream>
#define MAX 1009
#define INF 0x3f3f3f3f
using namespace std;
int g[MAX][MAX],d[MAX],n,m;
int vst[MAX];

void Dijkstra(int x){//只能测量x到各点的最短路,如果想要测出 点m到点n 和 点x到点y 的最短路,需要两次调用。
    
    fill(d,d+MAX,INF);//初始.
    fill(vst,vst+MAX,0);//初始化.
    
    d[x]=0;//x点到其本身的距离设为0.
    
    for(int i=1;i<=m;i++){
        
        int u=-1,MIN=INF;
        
        for(int j=1 ;j<=m;j++){
            if(vst[j]==0&&d[j]<MIN){
                u=j;
                MIN=d[j];//找出和点x距离最近的一个点。
            }
        }
        
        if(u==-1) return ;//表示已经没有和点x连通的点了,结束该函数。
        
        vst[u]=1;//标记最近的点。
        
        for(int v=1;v<=m;v++){
            if(vst[v]==0 && g[u][v]!=INF && d[u]+g[u][v]<d[v]){//更新各点到点x的距离。
                d[v]=d[u]+g[u][v];
            }
        }
        
    }
    
}

int main()
{
    ios::sync_with_stdio(0);
    
    int k1,k2;
    
    while(cin>>m>>n){
        
        if(m==0&&n==0){
            break;//简单的跳出指令。
        }
        
        fill(g[0],g[0]+MAX*MAX,INF);//仍然是初始化233333.
        
        for(int i=0;i<n;i++){//输入邻接矩阵中的值。
            cin>>k1>>k2;
            cin>>g[k1][k2];
            g[k2][k1]=g[k1][k2];
        }
        
        Dijkstra(1);//这个程序是计算从点1到点m的距离,应该根据实际需要更改。
        
        cout<<d[m]<<endl;
        
    }
    
    return 0;
    
}

猜你喜欢

转载自blog.csdn.net/StarrYooSkY/article/details/79224791