zoukankan      html  css  js  c++  java
  • hdu 2544 最短路(两点间最短路径)

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

    方法一:dijkstra算法,求两点之间最短路径。

    /************************************************************************/
    /*     
            hdu  最短路
            两点之间最短路径
            题目大意:dijkstra求两点之间最短路径。
    */
    /************************************************************************/
    
    #include <stdio.h>
    #include <string.h>
    #include <algorithm>
    #include <math.h>
    
    #define MAX 0xfffffff
    
    const int N = 101;
    int map[N][N];
    int vis[N];
    int dj[N];
    int num,m,n;
    
    void build_map()
    {
        int a,b,c;
        for (int i = 1; i <= n; i++)
        for (int j = i; j <= n; j++)
        map[i][j] = map[j][i] = (i==j)?0:MAX;
        for (int i = 0; i < m; i++)
        {
            scanf("%d%d%d",&a,&b,&c);
            map[a][b] = map[b][a] = c;
        }
    
    }
    
    int DJ()
    {
        int t = n;
        int sum = 0;
        int min,k;
        for (int i = 1; i <= n; i++)
        dj[i] = MAX;
        int cur = 1;
        dj[cur] = 0;
        while(1)
        {
            min = MAX;
            vis[cur] = 1;
            for (int i = 1; i <= n; i++)
            {
                if(vis[i]==1)continue;
                if(dj[i]>map[i][cur]+dj[cur])
                    dj[i] = map[i][cur]+dj[cur];
                if (dj[i]<min)
                {
                    min = dj[i];
                    k = i;
                }
            }
            cur = k;
            if(k==n)break;
        }
        
        return dj[n];
    }
    
    
    int main()
    {
        
        while(scanf("%d%d",&n,&m) && (n!=0 && m!=0) )
        {
            build_map();
            memset(vis,0,sizeof(vis));
            printf("%d
    ",DJ());
        }
        return 0;
    }

    方法二:floyd算法,求两点之间最短距离, distance[i][j] = min(distance[i][j], distance[i][k]+distance[k][j]);借助中间点。

    /************************************************************************/
    /*     
            hdu  最短路
            两点之间最短路径
            题目大意:floyd算法,求得两点之间最短距离,(u,v) = min( (u,v),(v,w)+(w,v) );
    */
    /************************************************************************/
    
    #include <stdio.h>
    #include <string.h>
    #include <algorithm>
    #include <math.h>
    
    #define MIN(a,b) a<b?a:b
    #define MAX 0xfffffff
    
    const int N = 101;
    int map[N][N];
    int vis[N];
    int dj[N];
    int num,m,n;
    
    void build_map()
    {
        int a,b,c;
        for (int i = 1; i <= n; i++)
        for (int j = i; j <= n; j++)
        map[i][j] = map[j][i] = (i==j)?0:MAX;
        for (int i = 0; i < m; i++)
        {
            scanf("%d%d%d",&a,&b,&c);
            map[a][b] = map[b][a] = c;
        }
    
    }
    
    int floyd()
    {
        for (int k = 1; k <= n; k++)
        {
            for (int i = 1; i <= n; i++)
            for (int j = 1; j <= n; j++)
            map[i][j] = MIN(map[i][j],map[i][k] + map[k][j]);
        }
        return map[1][n];
    }
    
    
    int main()
    {
        
        while(scanf("%d%d",&n,&m) && (n!=0 && m!=0) )
        {
            build_map();
            memset(vis,0,sizeof(vis));
            printf("%d
    ",floyd());
        }
        return 0;
    }
  • 相关阅读:
    Bzoj 3624: [Apio2008]免费道路 (贪心+生成树)
    [ZJOI2008]杀蚂蚁antbuster 题解
    赛前集训的第一个小总结(希望?)
    Bzoj1972: [Sdoi2010]猪国杀 题解(大模拟+耐心+细心)
    Luogu2150 寿司晚宴
    「考试总结2020-08-03」可期
    Luogu4747 [CERC2017]Intrinsic Interval
    BZOJ2839 集合计数
    Luogu5369 [PKUSC2018]最大前缀和
    Luogu5772 [JSOI2016]位运算
  • 原文地址:https://www.cnblogs.com/newpanderking/p/3253761.html
Copyright © 2011-2022 走看看