最短路

来源:互联网 发布:midi专业制作软件 编辑:程序博客网 时间:2024/05/01 03:26
/*HDU 2544 最短路经典入门 dijkstra算法,注意模型,点更新floy算法:深刻理解每个 for 循环意义 spfa算法:使用到队列,每个点最后一次被踢出的就是其最短路,可以自己画画模型 */#include<iostream>#include<cstdio>#include<queue>using namespace std;#define manx 120#define inf 99999999int g[manx][manx];int n,m,dist[manx];bool s[manx];  /// 加入集合,就标记为 1 void dijkstra(int st,int ed){    for(int i=1;i<=ed;i++){  /// 保存直接相连的路径距离         s[i]=0;              /// 初始化         dist[i]=g[st][i];     }    s[st]=1; dist[st]=0;        for(int i=1;i<=n;i++){        int temp =inf;       /// 无穷大路径长度         int ans = -1;        /// 最短点的下标         for(int j=1;j<=n;j++){            if(!s[j] && dist[j]<temp){                temp = dist[j];                ans = j;            }        }        if(ans==-1) break;        s[ans]=1;        for(int j=1;j<=n;j++){   /// 更新             if(!s[j]&&dist[j]>dist[ans]+g[ans][j])                dist[j]=dist[ans]+g[ans][j];        }    }}void floy(){    for(int k=1;k<=n;k++)   /// 借助点         for(int i=1;i<=n;i++)   /// 起点             for(int j=1;j<=n;j++)   ///  终点                 if(g[i][j]>g[i][k]+g[k][j])                    g[i][j]=g[j][i]=g[i][k]+g[k][j];}void spfa(int st){    queue<int>que;    while(!que.empty()) que.pop();    for(int i=1;i<=n;i++){        s[i]=0;        dist[i]=inf;    }    s[st]=1; dist[st]=0;    que.push(st);    while(!que.empty()){        int te = que.front();        que.pop();        s[te]=0; /// 抵消标记         for(int i=1;i<=n;i++){            if(dist[i]>dist[te]+g[te][i]){                dist[i] = dist[te]+g[te][i];  //// 更新                 if(!s[i]) {                    que.push(i);                    s[i]=1;                }            }        }    }}int main(){    while(cin>>n>>m,n&&m){        for(int i=0;i<=n;i++)             for(int j=0;j<=n;j++)                g[i][j]=inf;        int a,b,c;        for(int i=1;i<=m;i++){            scanf("%d%d%d",&a,&b,&c);            if(g[a][b]>c)                g[a][b]=g[b][a]=c;        }      //   dijkstra(1,n);     //   printf("%d\n",dist[n]);     //   floy();     //   printf("%d\n",g[1][n]);                spfa(1);        printf("%d\n",dist[n]);    }}