hdu 2680 Choose the best route (dijkstra算法)

简介:

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

复制代码
/************************************************************************/
/*     
        hdu  Arbitrage
        dijkstra算法
        题目大意:dijkstra算法,求点与点之间最短距离。因为此题的起始点不定,所以可用
        反向图来求得,终点确定,从终点出发,dijkstra算法,求出其他点到终点最小距离。
        本题数据量较大,用floyd算法超时。
*/
/************************************************************************/

#include <cstdio>
#include <cstring>
#include <string>
#include <map>
#include <algorithm>

using namespace std;

#define MIN(a,b) a<b?a:b
#define MAX 0xfffffff

const int N = 1001;
int maps[N][N];
int dj[N],vis[N];
int m,n,s,w,num,min_num;

void build_map()
{
    int p,q,t;
    for (int i = 1; i <= n; i++)
    for (int j = i; j <= n; j++)
    maps[i][j] = maps[j][i] = ((i==j)?0:MAX);

    for (int i = 1; i <= m; i++)
    {
        scanf("%d%d%d",&p,&q,&t);
        if(maps[q][p] > t) maps[q][p] = t;//这里注意构建反向图
    }

    for (int i = 1; i <= n; i++)
    dj[i] = MAX;
}

/*
//此floyd算法超时
void floyud()
{
    for (int k = 1; k <= n; k++)
    {
        for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++)
        maps[i][j] = MIN(maps[i][j],maps[i][k] + maps[k][j]);
    }
}
*/
void DJ()
{
    int cur = s;
    int next,min;
    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] > dj[cur] + maps[cur][i])
                dj[i] = dj[cur] + maps[cur][i];
            if (dj[i] < min)
            {
                min = dj[i];
                next = i;
            }
        }
        if ( min == MAX)break;
        cur = next;
    }
}

int main()
{
    while(scanf("%d%d%d",&n,&m,&s)!= EOF )
    {
        build_map();
        memset(vis,0,sizeof(vis));
        DJ();
        min_num = MAX;
        scanf("%d",&w);
        while(w--)
        {
            scanf("%d",&num);
            if ( dj[num] < min_num)
            min_num = dj[num];
        }
        if (min_num == MAX)
        printf("-1\n");
        else printf("%d\n",min_num);
    }
    return 0;
}
复制代码

 








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


相关文章
|
1月前
|
人工智能 算法 数据可视化
路径规划最全综述+代码+可视化绘图(Dijkstra算法+A*算法+RRT算法等)-2
路径规划最全综述+代码+可视化绘图(Dijkstra算法+A*算法+RRT算法等)-2
1235 0
|
1月前
|
算法
最短路之Dijkstra算法
最短路之Dijkstra算法
31 0
|
1月前
|
存储 人工智能 算法
路径规划最全综述+代码+可视化绘图(Dijkstra算法+A*算法+RRT算法等)-1
路径规划最全综述+代码+可视化绘图(Dijkstra算法+A*算法+RRT算法等)-1
236 0
|
20天前
|
存储 算法 数据可视化
Dijkstra算法在《庆余年》中的应用:范闲的皇宫之旅
Dijkstra算法在《庆余年》中的应用:范闲的皇宫之旅
|
24天前
|
存储 算法 C语言
数据结构学习记录——图-最短路径问题(无权图单源最短路径算法、有权图单源最短路径算法、多源最短路径算法、Dijkstra(迪杰斯特拉)算法、Floyd算法)
数据结构学习记录——图-最短路径问题(无权图单源最短路径算法、有权图单源最短路径算法、多源最短路径算法、Dijkstra(迪杰斯特拉)算法、Floyd算法)
28 1
|
29天前
|
算法 Java
JAVA中实现最短距离算法——Dijkstra算法详解
JAVA中实现最短距离算法——Dijkstra算法详解
15 1
|
10天前
|
算法 定位技术
探寻最短路径之谜:Dijkstra算法详解
探寻最短路径之谜:Dijkstra算法详解
|
1月前
|
网络协议 算法 数据库
【专栏】IS-IS协议是内部网关协议,常用于大型网络路由器间的路由信息交换,基于OSI的CLNP标准和Dijkstra算法
【4月更文挑战第28天】IS-IS协议是内部网关协议,常用于大型网络路由器间的路由信息交换,基于OSI的CLNP标准和Dijkstra算法。其特点是分层设计、快速收敛、高效资源利用和强故障恢复能力。在现代网络中,IS-IS广泛应用于服务提供商、企业网络及与其他协议的融合,是构建稳定、高效网络的关键。了解和应用IS-IS能提升网络系统的可靠性和效率。
|
1月前
|
人工智能 算法 BI
D - Silver Cow Party——POJ3268(连续用两次Dijkstra算法)
D - Silver Cow Party——POJ3268(连续用两次Dijkstra算法)
|
1月前
|
算法
Heavy Transportation(Dijkstra算法)
Heavy Transportation(Dijkstra算法)