• 旅行(Dijkstra)问题


    问题:输入:

    输入数据有多组,每组的第一行是三个整数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个数,表示草儿想去地方。

    输出:

    输入数据有多组,每组的第一行是三个整数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个数,表示草儿想去地方。

    样例输入:
    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

    样例输出:
    9

    回答:

    #include<iostream>
    #include<algorithm>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    #define MAXN 1010
    #define INF 0xFFFFFFF

    int t , s , d;
    int sCity[MAXN];
    int dCity[MAXN];
    int dis[MAXN];
    int vis[MAXN];
    int value[MAXN][MAXN];

    void init(){
       for(int i = 1 ; i < MAXN ; i++){
          for(int j = 1 ; j < MAXN ; j++)
            value[i][j] = INF;
       }
    }

    void Dijkstra(int s){
        int pos;
        memset(vis , 0 , sizeof(vis));
        for(int i = 1 ; i < MAXN; i++)
           dis[i] = INF;
        dis[s] = 0;
        for(int i = 1 ; i < MAXN ; i++){
           pos = -1;
           for(int j = 1 ; j < MAXN ; j++){
              if(!vis[j] && (pos == -1 || dis[j] < dis[pos]))
                pos = j;
           }
           if(pos == -1)
              break;
           vis[pos] = 1;
           for(int j = 1 ; j < MAXN ; j++){
              if(!vis[j] && dis[j] > dis[pos] + value[pos][j])
                dis[j] = dis[pos] + value[pos][j];
           }
        }
    }

    int main(){
       int a , b , v , ans;
       while(scanf("%d%d%d" , &t , &s , &d) != EOF){
          init();
          for(int i = 0 ; i < t ; i++){
             scanf("%d%d%d" , &a , &b , &v);
             if(value[a][b] > v)
               value[a][b] = value[b][a] = v;
          }
          for(int i = 0 ; i < s ; i++)
             scanf("%d" , &sCity[i]);
          for(int i = 0 ; i < d ; i++)
             scanf("%d" , &dCity[i]);
          ans = INF;
          /*枚举起点*/
          for(int i = 0 ; i < s ; i++){
             Dijkstra(sCity[i]);
             for(int j = 0 ; j < d ; j++)/*枚举终点*/
                ans = ans < dis[dCity[j]] ? ans : dis[dCity[j]];
          }
          printf("%d " , ans);
       }
       return 0;
    }

  • 相关阅读:
    location.href
    网络载入数据和解析JSON格式数据案例之空气质量监測应用
    概率dp HDU 3853
    poj2031-Building a Space Station(最小生成树,kruskal,prime)
    在JS数组指定位置插入元素
    leetcode
    leetcode笔记:Range Sum Query
    最优解算法的讨论
    NYOJ_77 开灯问题
    C++调用Lua的性能測试
  • 原文地址:https://www.cnblogs.com/benchao/p/4521372.html
Copyright © 2020-2023  润新知