HDU2544最短路 (Dijkstra求最短路)

来源:互联网 发布:快餐店收银软件 编辑:程序博客网 时间:2024/04/29 19:25

Dijkstra最简单的应用—直接套模版。注意这一题要考虑重路,也就是输入的两点A,B相同,这时存储的要是其中最小的C。直接上模版

#include <cstdio>#include <iostream>#include <algorithm>#include <cstring>using namespace std;const int maxn = 110;const int inf = 1e9;int map[maxn][maxn];int dist[maxn];int pre[maxn];int vis[maxn];int n, m;void Dijkstra(int v){    memset(vis, 0, sizeof(vis));    // 判断是否已存入该点到S集合中    for(int i = 1; i <= n; i++)    {        dist[i] = map[v][i];        if(dist[i] == inf)            pre[i] = 0;        else            pre[i] = v;    }    dist[v] = 0;    vis[v] = 1;    for(int i = 2; i <= n; i++)    {        int temp = inf;        int u = v;        for(int j = 1; j <= n; j++)        {            if(!vis[j]&&dist[j]<temp)            {                u = j;                temp = dist[j];            }        }        vis[u] = 1;        for(int j = 1; j <= n; j++)        {            if(!vis[j]&&map[u][j]!=inf)            {                int newdist = dist[u]+map[u][j];                if(dist[j] > newdist)                {                    dist[j] = newdist;                    pre[j] = u;                }            }        }    }}int main(){    while(cin>>n>>m)    {        if(!n||!m) break;        int p, q, line;        for(int i = 1; i <= n; i++)              for(int j = 1; j <= n; j++)              {                  if(i == j)                      map[i][j] = 0;                  else                      map[i][j] = inf;              }        while(m--)        {            scanf("%d%d%d", &p, &q, &line);            //此图为无方图             if(line < map[p][q])            {                map[p][q] = line;                  map[q][p] = line;            }        }        for(int i = 1; i <= n; i++)            dist[i] = inf;        Dijkstra(1);        cout<<dist[n]<<endl;    }    return 0;}



解题报告参考链接:

www.wutianqi.com/?p=1892

0 0
原创粉丝点击