zoukankan      html  css  js  c++  java
  • 一个人的旅行(用小技巧转化为dijkstra算法)

    注意:

      1:因为两点之间可能有多条路,所以更新路径长度的时候做一次判断

      if(time < mat[a][b])
        mat[a][b] = mat[b][a] = time;

      2:因为主函数中的数组实际上是在栈中存储的,而栈中内存有限,所以过大的数组不能在栈中开,要设置为全局变量

      比如此题中的矩阵就是10的六次方,我刚开始开到主函数中就不能运行

      3:dijkstra算法记得初始化任意两点之间的距离为无穷

      另外题目还有一个小技巧,在代码的注释中解释

    Description

    虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白马王子,^0^),很多事,还能丰富自己的阅历,还可以看美丽的风景……草儿想去很多地方,她想要去东京铁塔看夜景,去威尼斯看电影,去阳明山上看海芋,去纽约纯粹看雪景,去巴黎喝咖啡写信,去北京探望孟姜女……眼看寒假就快到了,这么一大段时间,可不能浪费啊,一定要给自己好好的放个假,可是也不能荒废了训练啊,所以草儿决定在要在最短的时间去一个自己想去的地方!因为草儿的家在一个小镇上,没有火车经过,所以她只能去邻近的城市坐火车(好可怜啊~)。
     

    Input

    输入数据有多组,每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个,草儿想去的地方有D个; 
    接着有T行,每行有三个整数a,b,time,表示a,b城市之间的车程是time小时;(1=<(a,b)<=1000;a,b 之间可能有多条路) 
    接着的第T+1行有S个数,表示和草儿家相连的城市; 
    接着的第T+2行有D个数,表示草儿想去地方。
     

    Output

    输出草儿能去某个喜欢的城市的最短时间。
     

    Sample Input

    6 2 3 1 3 5 1 4 7 2 8 12 3 8 4 4 9 12 9 10 2 1 2 8 9 10
     

    Sample Output

    9
    #include <iostream>
    #include <stdio.h>
    using namespace std;
    
    #define MAXN 1002
    #define inf 1000000000
    int mat[MAXN][MAXN];//数组太大所以要定义成全局变量,一定要注意注意
    typedef int elem_t;
    /*
        这道题实际上可以用小技巧转化为dijkstra算法
        草儿从家里出发,可以去临近城市坐车,那么就可以把草儿家看作起点,草儿家里到所有车站的时间记为0,这样起点就只有一个,
        如果把坐车的城市看作起点那就要比较很多次
        
        因为草儿的目的地也有很多,要求所花时间最短的目的地所花的时间
        那么就可以设置一个虚拟的目的地,让草儿所有想去的地方到这个虚拟的目的地的距离为0
        
        这样求得的草儿家到虚拟目的地的时间就是题目所要的时间
    */
    void dijkstra(int n, int s, elem_t min[], elem_t pre[])
    {
        int v[MAXN], i, j, k;
        for(i = 0; i < n; i++)
            min[i] = inf, v[i] = 0, pre[i] = -1;
        for(min[s] = 0, j = 0; j < n; j++)
        {
            for(k = -1, i = 0; i < n; i++)
            {
                if(!v[i] && (k == -1 || min[i] < min[k]))
                {
                    k = i;
                }
            }
            for(v[k] = 1, i = 0; i < n; i++)
            {
                if(!v[i] && min[k] + mat[k][i] < min[i])
                    min[i] = min[k] + mat[pre[i] = k][i];
            }
        }
    }
    int main()
    {
        int t, s, d;
        int min[MAXN], pre[MAXN];
        while(scanf("%d%d%d", &t, &s, &d) != EOF)
        {
            int a, b, time;
            //初始化任意两点之间的距离为无穷
            for(int i = 0; i <= MAXN; i++)
            {
                for(int j = 0; j <= MAXN; j++)
                {
                    mat[i][j] = mat[j][i] = inf;
                }
            }
            for(int i = 0; i < t; i++)
            {
                scanf("%d%d%d", &a, &b, &time);
                if(time < mat[a][b])//////////////////////////////////////
                    mat[a][b] = mat[b][a] = time;
            }
            int start, e;
            for(int i = 0; i < s; i++)
            {
                scanf("%d", &start);
                mat[0][start] = mat[start][0] = 0;
            }
            for(int j = 0; j < d; j++)
            {
                scanf("%d", &e);
                mat[e][1001] = mat[1001][e] = 0;
            }
            dijkstra(1002, 0, min, pre);
            printf("%d
    ", min[1001]);
        }
        return 0;
    }
     
  • 相关阅读:
    python-----贴图 和 报错:OSError: image file is truncated (8 bytes not processed)的处理
    springboot集成RabbitMQ
    MySQL数据库设计规范
    腾讯云COS对象存储
    腾讯云OCR图片文字识别
    java基础之 java注释
    centos7下自动备份mysql数据库
    nginx配置ssl证书
    java基础之 控制语句
    js -- 操作sqlite数据库
  • 原文地址:https://www.cnblogs.com/rain-1/p/5673417.html
Copyright © 2011-2022 走看看