hdu 2066 一个人的旅行

点击打开链接hdu 2066


思路:最短路+Dijkstra
分析:题目给定的起点有s个,终点有d个。要求找到从起点到这些终点最短的路径。很显然只要枚举起点然后比较最后得到最小的值。

代码:

#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\n" , ans);
   }
   return 0;
}



你可能感兴趣的:(hdu 2066 一个人的旅行)