HDU2544 最短路 + 裸 + dijkstra + 邻接矩阵


1)

//hdu 2544,裸dijkstra
#include <iostream>
#include <string.h>

using namespace std;
const int maxn=120;
const int INF=999999;
int lukou[maxn][maxn];
int visted[maxn];//区别该点是否进入确定的集合之中
int d[maxn];//目前从起点出发,到第i点的最短距离
int dijkstra(int s,int n){

        visted[s]=1;//1进入集合
        for(int i=1;i<=n;i++){
                d[i]=lukou[s][i];//因为1是起点,所以我们先把这个点放入确定的集合之中,也就得到了目前所知的从起点出发,到其他点的初始距离
                //cout<<i<<":"<<d[i]<<endl;
        }

        for(int k=1;k<=n-1;k++){
                int jilu;
                int minn=INF;
                //从起点出发,找出从起点到其他未加入集合中的点i的最短距离的d[i]
                for(int i=1;i<=n;i++){
                        if(!visted[i]&&minn>d[i]){
                                minn=d[i];
                                jilu=i;
                        }
                }
                visted[jilu]=1;//将该点放入确定的点集中

                //因为新加入点,更新从起点出发经过新加入的点到其他的未加入集合的点的距离
                for(int i=1;i<=n;i++){
                        if(!visted[i]&&d[i]>d[jilu]+lukou[jilu][i]){
                                d[i]=d[jilu]+lukou[jilu][i];
                        }
                }
                //继续外层for循环,知道循环n-1次,代表找到了最短路径(因为极端情况下从第一个点到最后一个点,最短路径最少经过n-1条边,这一点和bellmanford 最外层的v-1次循环是一个到道理(v是点的个数))
        }
        return d[n];
}


int main()
{
    int n,m;
    while(cin>>n>>m&&n!=0){
        int a,b,v;
        int s=1;//起点
        memset(visted,0,sizeof(visted));
        for(int i=1;i<=n;i++){
                for(int j=1;j<=n;j++){
                        if(i==j){
                                lukou[i][j]=0;
                        }
                        else
                                lukou[i][j]=INF;
                }
        }
        for(int i=1;i<=m;i++){
                cin>>a>>b>>v;
                lukou[a][b]=v;
                lukou[b][a]=v;
        }
        cout<<dijkstra(s,n)<<endl;
    }
    return 0;
}


你可能感兴趣的:(最短路,dijkstra,邻接矩阵,裸)