zoukankan      html  css  js  c++  java
  • hdu 2112 HDU Today

    HDU Today

    Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 22729    Accepted Submission(s): 5448


    Problem Description
    经过锦囊相助,海东集团终于度过了危机,从此,HDU的发展就一直顺风顺水,到了2050年,集团已经相当规模了,据说进入了钱江肉丝经济开发区500强。这时候,XHD夫妇也退居了二线,并在风景秀美的诸暨市浬浦镇陶姚村买了个房子,开始安度晚年了。
    这样住了一段时间,徐总对当地的交通还是不太了解。有时很郁闷,想去一个地方又不知道应该乘什么公交车,在什么地方转车,在什么地方下车(其实徐总自己有车,却一定要与民同乐,这就是徐总的性格)。
    徐总经常会问蹩脚的英文问路:“Can you help me?”。看着他那迷茫而又无助的眼神,热心的你能帮帮他吗?
    请帮助他用最短的时间到达目的地(假设每一路公交车都只在起点站和终点站停,而且随时都会开)。
     
    Input
    输入数据有多组,每组的第一行是公交车的总数N(0<=N<=10000);
    第二行有徐总的所在地start,他的目的地end;
    接着有n行,每行有站名s,站名e,以及从s到e的时间整数t(0<t<100)(每个地名是一个长度不超过30的字符串)。
    note:一组数据中地名数不会超过150个。
    如果N==-1,表示输入结束。
     
    Output
    如果徐总能到达目的地,输出最短的时间;否则,输出“-1”。
     
    Sample Input
    6
    xiasha westlake
    xiasha station 60
    xiasha ShoppingCenterofHangZhou 30
    station westlake 20
    ShoppingCenterofHangZhou supermarket 10
    xiasha supermarket 50
    supermarket westlake 10
    -1
     
    Sample Output
    50
     
    Hint:
    The best route is:
    xiasha->ShoppingCenterofHangZhou->supermarket->westlake
     
    虽然偶尔会迷路,但是因为有了你的帮助
    **和**从此还是过上了幸福的生活。
     
    ――全剧终――
     
    Author
    lgx
     
    Source
     
    Recommend
    lcy   |   We have carefully selected several similar problems for you:  2680 1142 1385 1690 2722 
     
    还是简单的最短路模板,不过这题输入的字符串,因此要将字符转化为整数数组存储,方便比较路程。
     
    题意:中文题,很好理解。
     
    附上代码:
     
     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #define M 160
     5 #define MAX 0x3f3f3f3f
     6 using namespace std;
     7 int m;
     8 int map[M][M],vis[M],dis[M];
     9 char place[M][35];
    10 
    11 int find(char s[])  //关键处理,将字符串数组转换为整数数组存储
    12 {
    13     int i;
    14     for(i=1; i<=m; i++)
    15     {
    16         if(strcmp(s,place[i])==0)
    17             return i;
    18     }
    19     strcpy(place[++m],s);
    20     return m;
    21 }
    22 
    23 int main()
    24 {
    25     int n,i,j,f,e;
    26     char s[35];
    27     while(~scanf("%d",&n))
    28     {
    29         if(n==-1) break;
    30         m=0;
    31         scanf("%s",s),f=find(s);
    32         scanf("%s",s),e=find(s);
    33         memset(vis,0,sizeof(vis));
    34         memset(dis,0,sizeof(dis));
    35         for(i=1; i<=150; i++)
    36             for(j=1; j<=150; j++)
    37             {
    38                 if(i==j) map[i][j]=0;
    39                 else     map[i][j]=MAX;
    40             }
    41         int a,b,c;
    42         while(n--)
    43         {
    44             scanf("%s",s),a=find(s);
    45             scanf("%s",s),b=find(s);
    46             scanf("%d",&c);
    47             if(map[a][b]>c)
    48                 map[a][b]=c,map[b][a]=c;
    49         }
    50         vis[f]=1;
    51         for(i=1; i<=m; i++)
    52             dis[i]=map[f][i];
    53         int min,t;
    54         for(i=1; i<=m; i++)
    55         {
    56             min=MAX;
    57             for(j=1; j<=m; j++)
    58                 if(!vis[j]&&dis[j]<min)
    59                 {
    60                     min=dis[j];
    61                     t=j;
    62                 }
    63             vis[t]=1;
    64             for(j=1; j<=m; j++)
    65                 if(!vis[j]&&map[t][j]<MAX)
    66                     if(dis[j]>dis[t]+map[t][j])
    67                         dis[j]=dis[t]+map[t][j];
    68         }
    69         if(dis[e]<MAX)
    70             printf("%d
    ",dis[e]);
    71         else
    72             printf("-1
    ");
    73     }
    74     return 0;
    75 }

    邻接表:

      1 #include <iostream>
      2 #include <cstdio>
      3 #include <cstring>
      4 #include <queue>
      5 #define M 10005
      6 #define N 155
      7 #define INF 0x3f3f3f3f
      8 #define ll long long
      9 using namespace std;
     10 int n,m,tol,s,t;
     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 char place[N][35];
     19 
     20 int find(char s[])
     21 {
     22     for(int i=1;i<=m;i++)
     23     {
     24         if(strcmp(s,place[i])==0)
     25         return i;
     26     }
     27     strcpy(place[++m],s);
     28     return m;
     29 }
     30 
     31 void init()
     32 {
     33     tol=0;
     34     memset(head,-1,sizeof(head));
     35 }
     36 
     37 void addEdge(int u,int v,int val)
     38 {
     39     edge[tol].from=u;
     40     edge[tol].to=v;
     41     edge[tol].val=val;
     42     edge[tol].next=head[u];
     43     head[u]=tol++;
     44     edge[tol].from=v;
     45     edge[tol].to=u;
     46     edge[tol].val=val;
     47     edge[tol].next=head[v];
     48     head[v]=tol++;
     49 }
     50 
     51 void getmap()
     52 {
     53     char ss[35];
     54     scanf("%s",ss),s=find(ss);
     55     scanf("%s",ss),t=find(ss);
     56     int a,b,c;
     57     while(n--)
     58     {
     59         scanf("%s",ss),a=find(ss);
     60         scanf("%s",ss),b=find(ss);
     61         scanf("%d",&c);
     62         addEdge(a,b,c);
     63     }
     64     memset(dis,INF,sizeof(dis));
     65     memset(vis,false,sizeof(vis));
     66 }
     67 
     68 void spfa()
     69 {
     70     queue<int>q;
     71     q.push(s);
     72     vis[s]=true;
     73     dis[s]=0;
     74     while(!q.empty())
     75     {
     76         int u=q.front();
     77         q.pop();
     78         vis[u]=false;
     79         for(int i=head[u];i!=-1;i=edge[i].next)
     80         {
     81             int v=edge[i].to;
     82             if(dis[v]>dis[u]+edge[i].val)
     83             {
     84                 dis[v]=dis[u]+edge[i].val;
     85                 if(!vis[v])
     86                 {
     87                     vis[v]=true;
     88                     q.push(v);
     89                 }
     90             }
     91         }
     92     }
     93     if(dis[t]<INF)
     94     printf("%d
    ",dis[t]);
     95     else
     96     printf("-1
    ");
     97     return;
     98 }
     99 
    100 int main()
    101 {
    102     while(~scanf("%d",&n))
    103     {
    104         if(n==-1) break;
    105         init();
    106         getmap();
    107         spfa();
    108     }
    109     return 0;
    110 }
  • 相关阅读:
    POJ Area of Simple Polygons 扫描线
    POJ2828 Buy Tickets 线段树
    cf578c Weakness and Poorness 三分
    poj3737 UmBasketella 真正的三分
    POJ1061 青蛙的约会 exgcd
    POJ3090 Visible Lattice Points 欧拉函数
    P2860 [USACO06JAN]冗余路径Redundant Paths
    [JSOI2008]球形空间产生器
    [APIO2010]特别行动队
    [ZJOI2007]仓库建设
  • 原文地址:https://www.cnblogs.com/pshw/p/5371472.html
Copyright © 2011-2022 走看看