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

来源:互联网 发布:樱井知香黑人 编辑:程序博客网 时间:2024/06/05 14:23


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;}


0 0
原创粉丝点击