• HDU 2544最短路 (迪杰斯特拉算法)


    传送门:

    http://acm.hdu.edu.cn/showproblem.php?pid=2544

    最短路

    Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 83843    Accepted Submission(s): 36272


    Problem Description
    在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗?

     
    Input
    输入包括多组数据。每组数据第一行是两个整数N、M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路。N=M=0表示输入结束。接下来M行,每行包括3个整数A,B,C(1<=A,B<=N,1<=C<=1000),表示在路口A与路口B之间有一条路,我们的工作人员需要C分钟的时间走过这条路。
    输入保证至少存在1条商店到赛场的路线。
     
    Output
    对于每组输入,输出一行,表示工作人员从商店走到赛场的最短时间
     
    Sample Input
    2 1
    1 2 3
    3 3
    1 2 5
    2 3 5
    3 1 2
    0 0
     
    Sample Output
    3
    2
     
    Source
     
    ps:
    前面做了几道迪杰斯特拉算法的题,这次一次过了,开心
    注意点:
    重边的情况 
    代码如下:
    #include<bits/stdc++.h>
    using namespace std;
    #define max_v 105
    #define INF 99999
    int edge[max_v][max_v];
    int n,m;
    int used[max_v];
    int dis[max_v];
    void init()
    {
        memset(used,0,sizeof(used));
        for(int i=1; i<=n; i++)
        {
            for(int j=1; j<=n; j++)
            {
                edge[i][j]=INF;
            }
            dis[i]=INF;
        }
    }
    void Dijkstra(int s)
    {
        for(int i=1; i<=n; i++)
        {
            dis[i]=edge[s][i];
        }
        dis[s]=0;
        for(int i=1; i<=n; i++)
        {
            int index,mindis=INF;
            for(int j=1; j<=n; j++)
            {
                if(used[j]==0&&dis[j]<mindis)
                {
                    mindis=dis[j];
                    index=j;
                }
            }
            used[index]=1;
            for(int j=1; j<=n; j++)
            {
                if(dis[index]+edge[index][j]<dis[j])
                {
                    dis[j]=dis[index]+edge[index][j];
                }
            }
        }
    }
    int main()
    {
        while(~scanf("%d %d",&n,&m))
        {
            if(n==0&&m==0)
                break;
           if(n==1)
            {
                printf("0
    ");
                continue;
            }
            init();
            for(int i=0; i<m; i++)
            {
                int a,b,c;
                scanf("%d %d %d",&a,&b,&c);
                if(edge[a][b]>c)//预防重边
                {
                    edge[a][b]=edge[b][a]=c;
                }
            }
            Dijkstra(1);
            printf("%d
    ",dis[n]);
        }
    }
  • 相关阅读:
    sql 删除默认索引,对象 依赖于 列,由于一个或多个对象访问此列
    sql 重复数据查询
    Sql 查询结果 根据某个字段值 变更另外一个字段值 case when
    使用ABP框架踩过的坑系列3
    使用ABP框架踩过的坑系列5
    使用ABP框架踩过的坑系列4
    使用ABP框架踩过的坑系列2
    使用ABP框架踩过的坑系列1
    java rest框架jersey数组单记录问题解决
    测试工程师面试常见逻辑题
  • 原文地址:https://www.cnblogs.com/yinbiao/p/9197559.html
Copyright © 2020-2023  润新知