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\n",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\n",floyd());
    }
    return 0;
}
复制代码

 








本文转自NewPanderKing51CTO博客,原文链接:http://www.cnblogs.com/newpanderking/p/3253761.html ,如需转载请自行联系原作者


相关文章
|
6月前
|
算法
最短路之Floyd算法
最短路之Floyd算法
75 1
|
6月前
|
算法
最短路之Dijkstra算法
最短路之Dijkstra算法
57 0
|
6月前
最短路径问题(HDU3790)
最短路径问题(HDU3790)
|
11月前
|
机器学习/深度学习 编解码 算法
|
11月前
|
C++
|
存储 算法
最短路Johnson算法
最短路Johnson算法
108 0
|
算法
最短路径——Floyd算法
最短路径——Floyd算法
141 0
|
算法 机器人 C++
数据结构与算法之最短路路径与最短路径和&&动态规划
数据结构与算法之最短路路径与最短路径和&&动态规划
252 0
数据结构与算法之最短路路径与最短路径和&&动态规划
|
算法 C语言
最短路径——Dijkstra算法与Floyd算法
最短路径——Dijkstra算法与Floyd算法
207 0
最短路径——Dijkstra算法与Floyd算法
|
机器学习/深度学习 定位技术