HDU 2066 一个人的旅行

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



分析:

题目要求输出草儿想去的城市的最短时间,就是 家->A(相邻城市)->B(几个中的任意一个) 的最短距离。

由于最终是从一个出发点到一个终点,仔细分析,不难得出这是个单源最短路问题(就是一个出发点,一个终点)。

所以可以运用dijkstra。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#define maxx 999999999
using namespace std;
int t, s, d, n,u;
int map[1005][1005];
int star[1005];
int terminal[1005];
int _distance[1005];
int vis[1005];
void djstl()
{
    memset(vis, 0, sizeof(vis));
    for (int i = 0;i <= n;++i)
    {
        _distance[i] = map[0][i];

        //此处代表所有点到0点的距离;用 _distance[i]表示
    }
    vis[0] = 1;

    //标记0点已经走过-------------------------------------
    for (int i = 1;i <= n - 1;++i)
    {
        int mins = maxx;
        for (int j = 1;j <= n;++j)
        {
            if (!vis[j] && mins > _distance[j])
            {
                mins = _distance[j];
                u = j;
            }
        }
        if (vis[u])
            continue;

        //没有检验到离i最近的点,直接进入下一个循环.(注意u定义的位置)
        vis[u] = 1;
        for (int j = 1;j <= n;++j)
        {
            if (map[u][j] != maxx)
                if (map[u][j] + _distance[u] < _distance[j])
                    _distance[j] = _distance[u] + map[u][j];
            
        //松弛操作,到达u的距离+从u到达j的距离,比已有的线路到达j,更短,则更新
        }
    }
}
int main()
{
    while (scanf("%d%d%d", &t, &s, &d) == 3)
    {
        for (int i = 0;i < 1005;++i)
        {
            for (int j = 0;j < 1005;++j)
                map[i][j] = maxx;
            map[i][i] = 0;
        }

        //用邻接矩阵保存无向图--------------------------------------
        int a, b, tim;
        n = 0;
        for (int i = 0;i < t;++i)
        {
            scanf("%d%d%d", &a, &b, &tim);
            map[a][b] = map[b][a] = map[a][b]>tim ? tim : map[a][b];

            //保存两个城市之间的最短路径-----------------------------
            n = max(max(a, n), b);

            //保存最多能有几个城市(节约时间)-------------------------
        }
        for (int i = 0;i < s;++i)
        {
            scanf("%d", &star[i]);
            map[0][star[i]] = map[star[i]][0] = 0;

            //相当于有多个起点---------------------------------------
        }
        djstl();
        int mins = maxx;
        for (int i = 0;i < d;++i)
        {
            scanf("%d", &terminal[i]);
            if (_distance[terminal[i]] < mins)
                mins = _distance[terminal[i]];
            
            //找出最短距离即可---------------------------------------
        }
        cout << mins << endl;
    }
}

你可能感兴趣的:(ACM,最短路径,初学者)