• hdu 2066 一个人的旅行


    一个人的旅行

    Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 28925    Accepted Submission(s): 9942


    Problem 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
     
    Author
    Grass
     
    Source
     
    Recommend
    lcy   |   We have carefully selected several similar problems for you:  1142 1385 2722 1690 1596 
     
    将草儿的家看作城市0,能从家直接到的城市距离为0,其他为MAX。
     
    题意:中文题,很好理解。
     
    附上代码:
     
     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #define M 1005
     5 #define MAX 0x3f3f3f3f
     6 using namespace std;
     7 int map[M][M],vis[M],dis[M];
     8 int main()
     9 {
    10     int n,m,i,j,T,S,D;
    11     while(~scanf("%d%d%d",&T,&S,&D))
    12     {
    13         memset(vis,0,sizeof(vis));
    14         memset(dis,0,sizeof(dis));
    15         for(i=0; i<=1000; i++)
    16             for(j=0; j<=1000; j++)
    17             {
    18                 if(i==j) map[i][j]=0;
    19                 else     map[i][j]=MAX;
    20             }
    21         int a,b,c;
    22         n=0;
    23         while(T--)
    24         {
    25             scanf("%d%d%d",&a,&b,&c);
    26             if(a>n) n=a;
    27             if(b>n) n=b;
    28             if(map[a][b]>c)
    29                 map[a][b]=c,map[b][a]=c;
    30         }
    31         int k;
    32         for(i=1; i<=S; i++)
    33         {
    34             scanf("%d",&k);
    35             map[0][k]=0;   //将小草的家看作城市0
    36             map[k][0]=0;
    37         }
    38         vis[0]=1;
    39         for(i=0; i<=n; i++)
    40             dis[i]=map[0][i];
    41         int min,t;
    42         for(i=1; i<=n; i++)
    43         {
    44             min=MAX;
    45             for(j=1; j<=n; j++)
    46                 if(!vis[j]&&dis[j]<min)
    47                 {
    48                     min=dis[j];
    49                     t=j;
    50                 }
    51 
    52             vis[t]=1;
    53             for(j=1; j<=n; j++)
    54                 if(!vis[j]&&map[j][t]<MAX)
    55                     if(dis[j]>dis[t]+map[j][t])
    56                         dis[j]=dis[t]+map[j][t];
    57         }
    58         min=MAX;
    59         for(i=1; i<=D; i++)
    60         {
    61             scanf("%d",&k);   
    62             if(min>dis[k]) //寻找草儿想去的路程最短的城市
    63                 min=dis[k];
    64         }
    65         printf("%d
    ",min);
    66     }
    67     return 0;
    68 }

    邻接表:

      1 #include <iostream>
      2 #include <cstdio>
      3 #include <cstring>
      4 #include <queue>
      5 #define M 10005
      6 #define N 1005
      7 #define INF 0x3f3f3f3f
      8 #define ll long long
      9 using namespace std;
     10 int T,S,D,tol;
     11 struct Edge
     12 {
     13     int from,to,val;
     14     int next;
     15 }edge[M*2];
     16 int dis[N],head[M*2];
     17 bool vis[N];
     18 
     19 void init()
     20 {
     21     tol=0;
     22     memset(head,-1,sizeof(head));
     23 }
     24 
     25 void addEdge(int u,int v,int val)
     26 {
     27     edge[tol].from=u;
     28     edge[tol].to=v;
     29     edge[tol].val=val;
     30     edge[tol].next=head[u];
     31     head[u]=tol++;
     32     edge[tol].from=v;
     33     edge[tol].to=u;
     34     edge[tol].val=val;
     35     edge[tol].next=head[v];
     36     head[v]=tol++;
     37 }
     38 
     39 void getmap()
     40 {
     41     int a,b,c;
     42     while(T--)
     43     {
     44         scanf("%d%d%d",&a,&b,&c);
     45         addEdge(a,b,c);
     46     }
     47     int x;
     48     while(S--)
     49     {
     50         scanf("%d",&x);
     51         addEdge(0,x,0);
     52     }
     53     memset(dis,INF,sizeof(dis));
     54     memset(vis,false,sizeof(vis));
     55 }
     56 
     57 void spfa()
     58 {
     59     queue<int>q;
     60     q.push(0);
     61     vis[0]=true;
     62     dis[0]=0;
     63     while(!q.empty())
     64     {
     65         int u=q.front();
     66         q.pop();
     67         vis[u]=false;
     68         for(int i=head[u];i!=-1;i=edge[i].next)
     69         {
     70             int v=edge[i].to;
     71             if(dis[v]>dis[u]+edge[i].val)
     72             {
     73                 dis[v]=dis[u]+edge[i].val;
     74                 if(!vis[v])
     75                 {
     76                     vis[v]=true;
     77                     q.push(v);
     78                 }
     79             }
     80         }
     81     }
     82     int x,minx=INF;
     83     while(D--)
     84     {
     85         scanf("%d",&x);
     86         if(minx>dis[x])
     87         minx=dis[x];
     88     }
     89     printf("%d
    ",minx);
     90     return;
     91 }
     92 
     93 int main()
     94 {
     95     while(~scanf("%d%d%d",&T,&S,&D))
     96     {
     97         init();
     98         getmap();
     99         spfa();
    100     }
    101     return 0;
    102 }
  • 相关阅读:
    [COCI2013]DLAKAVAC
    [TJOI2013]最长上升子序列
    AGC040E Prefix Suffix Addition
    AGC010E Rearranging
    AGC021F Trinity
    AGC002F Leftmost Ball
    JOISC2019D ふたつのアンテナ
    LOJ6210 「美团 CodeM 决赛」tree
    Luogu P3781 [SDOI2017]切树游戏
    Problem. M
  • 原文地址:https://www.cnblogs.com/pshw/p/5371077.html
Copyright © 2020-2023  润新知