• hdu-2066 一个人的旅行


    Problem Description

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

    Input

    输入数据有多组,每组的第一行是三个整数TSD,表示有T条路,和草儿家相邻的城市的有S个,草儿想去的地方有D个;
    接着有T行,每行有三个整数abtime,表示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

      1 /*
      2 1.定义一个邻接矩阵map,存放各点间最短路径
      3 2.定义一个数组home,存放邻近家的地点
      4 3.定义一个数组visit,存放想去的地方
      5 4.改写dijkstra,形如:int dijkstra(int map[][],int p,int visit[]);
      6   使其返回起点到想去地方的最短距离
      7 5.定义一个数组minDis,存放各个dijksrta的返回值
      8 6.选出minDis中最小的值,输出
      9 */
     10 
     11 /*
     12 输入数据有多组,每组的第一行是三个整数T,S和D,
     13 表示有T条路,和草儿家相邻的城市的有S个,草儿想去的地方有D个;
     14 接着有T行,每行有三个整数a,b,time,表示a,b城市之间的车程是time小时;
     15 (1=<(a,b)<=1000;a,b 之间可能有多条路)
     16 接着的第T+1行有S个数,表示和草儿家相连的城市;
     17 接着的第T+2行有D个数,表示草儿想去地方。
     18 */
     19 #include <stdio.h>
     20 #include <string.h>
     21 #define INF 2000000000      //一定要足够大
     22 #define MAX 100
     23 
     24 int dijkstra(int map[MAX][MAX],int p,int visit[],int d);
     25 
     26 int main()
     27 {
     28     int t,s,d;
     29     int a,b,time;
     30     int map[MAX][MAX];
     31     int home[MAX];
     32     int visit[MAX];
     33     int minDis[MAX];
     34     int minD;
     35     int i,j;
     36     while (~scanf("%d%d%d",&t,&s,&d))
     37     {
     38         if (t==0)
     39             break;
     40         for (i=1; i<MAX; i++)      //将邻接矩阵初始化为INF
     41             for (j=1; j<MAX; j++)
     42                 map[i][j] = INF;
     43         for (i=1; i<=t; i++)        //更新邻接矩阵的值
     44         {
     45             scanf("%d%d%d",&a,&b,&time);
     46             if (map[a][b]>time)     //选取两点之间最短路径
     47                 map[a][b] = map[b][a] = time;
     48         }
     49         for (i=1; i<=s; i++)        //输入s个邻近家的地方
     50             scanf("%d",&home[i]);
     51         for (i=1; i<=d; i++)        //输入d个想去的地方
     52             scanf("%d",&visit[i]);
     53         for (i=1; i<=s; i++)        //将邻近家的地方依次作为起点
     54         {
     55             minDis[i] = dijkstra(map,home[i],visit,d);
     56         }
     57         minD = minDis[1];
     58         for (i=2; i<=s; i++)        //从各个不同的起点到目的地的最小距离中再选出最小的
     59             if (minD>minDis[i])
     60                 minD = minDis[i];
     61         printf("%d
    ",minD);        //输出
     62     }
     63     return 0;
     64 }
     65 
     66 int dijkstra(int map[MAX][MAX],int p,int visit[],int d)
     67 {
     68     int dist[MAX];
     69     int s[MAX];
     70     int minDist = INF;
     71     int mint;
     72     int t;
     73     int temp;
     74     int i,j;
     75     for (i=1; i<MAX; i++)
     76         dist[i] = map[p][i];
     77     memset(s,0,MAX*sizeof(int));
     78     s[p] = 1;
     79     dist[p] = 0;
     80     for (i=1; i<MAX; i++)
     81     {
     82         mint = INF;
     83         t = p;
     84         for (j=1; j<MAX; j++)
     85             if (mint>dist[j]&&!s[j])
     86             {
     87                 mint = dist[j];
     88                 t = j;
     89             }
     90         s[t] = 1;
     91         for (j=1; j<MAX; j++)
     92             if (!s[j]&&map[t][j]<INF)
     93                 if (dist[t]+map[t][j]<dist[j])
     94                     dist[j] = dist[t]+map[t][j];
     95     }
     96     for (i=1; i<=d; i++)
     97     {
     98         temp = visit[i];
     99         if (dist[temp]<minDist)
    100             minDist = dist[temp];
    101     }
    102     return minDist;
    103 }
    蒹葭苍苍,白露为霜; 所谓伊人,在水一方。
  • 相关阅读:
    Nodejs exec和spawn的区别
    VC++每个版本对应的库
    在cmd启动一个win32程序,printf把信息输出到启运它的那个CMD窗口
    window 控制台解决中文乱码
    NW.js 桌面应用程序
    C++ Addon Async 异步机制
    Node bak
    nodejs electron 创建桌面应用
    跨平台桌面程序框架Electron
    js post 下载文件
  • 原文地址:https://www.cnblogs.com/huwt/p/9971391.html
Copyright © 2020-2023  润新知