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

       http://acm.hdu.edu.cn/showproblem.php?pid=2112

    怎样把具体的字母的地点转换为数字的函数为题目的重点

                             HDU Today

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

    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
    这是我参考别人的代码过的:
     
     1 #include<stdio.h>
     2 #include<string.h>
     3 #define maxint 0xfffffff
     4 int map[160][160], visited[160], n, m, s, e;
     5 long dis[160];
     6 char name[160][32];
     7 int find(char str[32])
     8 {
     9     int i;
    10     for(i = 1; i <= m; ++i){
    11         if(strcmp(name[i], str) == 0)
    12             return i;
    13     }
    14     if(m == 0 || i > m){
    15         ++m;
    16         strcpy(name[m], str);
    17         return m;
    18     }
    19 }//函数的写法。
    20 void dijkstra(int s, int e)
    21 {
    22     int i, j, mid;
    23     for(i = 1; i <= m; i++)
    24     {
    25         dis[i] = map[s][i];
    26         visited[i] = i == s ? 1 : 0;
    27     }
    28     for(i = 1; i <= m - 1; i++)
    29     {
    30         mid = 0;
    31         dis[mid] = maxint;
    32         for(j = 1; j <= m; j++)
    33             if(!visited[j] && dis[j] < dis[mid])
    34                 mid = j;
    35         visited[mid] = 1;
    36         for(j = 1; j <= m; j++)
    37             if(map[mid][j] < maxint && !visited[j] && map[mid][j] + dis[mid] < dis[j])
    38                 dis[j] = map[mid][j] + dis[mid];
    39     }
    40 }
    41 int main()
    42 {
    43     int i, j, a, b, c;
    44     char s1[40], s2[40], start[40], end[40];
    45     scanf("%d", &n);
    46     while(n != -1)
    47     {
    48         m = 0;
    49         for(i = 1; i <= 140; ++i){
    50             for(j = 1; j <= 140; j++)
    51                 map[i][j] = maxint;
    52         }
    53         scanf("%s %s", start, end);
    54         for(i = 1; i <= n; i++)
    55         {
    56             scanf("%s %s %d", s1, s2, &c);
    57             a = find(s1);
    58             b = find(s2);
    59             if(map[a][b] > c)
    60             {
    61                 map[a][b] = c;
    62                 map[b][a] = c;
    63             }
    64         }
    65         s = find(start);
    66         e = find(end);
    67         if(s == e)
    68             printf("0
    ");
    69         else{
    70             dijkstra(s, e);
    71             if(dis[e] != maxint)
    72                 printf("%ld
    ", dis[e]);
    73             else
    74                 printf("-1
    ");
    75         }
    76     scanf("%d", &n);
    77     }
    78     return 0;
    79 }

     但是我原先自己写的俩个算法怎么也过不了,我不知道是什么原因:要找出来。。。

     1 #include<stdio.h>
     2 #include<string.h>
     3 #define Max 0xfffffff
     4 int map[160][160],mark[160];
     5 int n,m,s,e;
     6 long f[160];
     7 char name[160][32];
     8 int find(char str[30])
     9 {
    10     int i;
    11     for(i=1;i<=m;i++)
    12     {
    13         if(strcmp(name[i],str)==0)
    14             return i;
    15     }
    16     if(m==0||i>m)
    17     {
    18         ++m;
    19       strcpy(name[m],str); 
    20      
    21       return m;
    22     }
    23 }
    24 int min(int x,int y)
    25 {
    26     return x>y?y:x;
    27 }
    28 void getmap()
    29 {
    30     int a,b,i,j,l;
    31     char s1[40],s2[40];
    32     for(i=0;i<=140;i++)
    33         for(j=0;j<=140;j++)
    34             map[i][j]=(i==j?0:Max);
    35         for(i=0;i<n;i++)
    36         {
    37             scanf("%s%s%d",&s1,&s2,&l);
    38               a=find(s1);
    39               b=find(s2);
    40             map[a-1][b-1]=map[b-1][a-1]=min(map[a-1][b-1],l);
    41         }
    42 }
    43 void dijkstra()
    44 {
    45     int i,j,k,min;
    46     memset(mark,0,sizeof(mark));
    47     for(i=0;i<n;i++)
    48         f[i]=map[s][i];
    49     f[s]=0;
    50     for(i=0;i<n;i++)
    51     {
    52         min=Max;
    53         for(j=0;j<n;j++)
    54         {
    55             if(!mark[j]&&min>f[j])
    56             {
    57                 k=j;
    58                 min=f[j];
    59             }
    60         }
    61         if(min==Max)break;
    62         mark[k]=1;
    63         for(j=0;j<n;j++)
    64             if(!mark[j]&&f[j]>f[k]+map[k][j])
    65               f[j]=map[k][j]+f[k];
    66     }
    67     if(f[e]!=Max) printf("%ld
    ",f[e]);
    68     else printf("-1
    ");
    69 }
    70 
    71  int main()
    72 {
    73      while(~scanf("%d",&n)&&n>0)
    74      {
    75          if(n==-1)
    76             break;
    77         char start[40],end[40];
    78         scanf("%s%s",start,end);
    79          s=find(start)-1;
    80          e=find(end)-1;
    81          getmap();
    82          if(s==e)
    83              printf("0
    ");
    84          else
    85            dijkstra();
    86         
    87     }
    88     return 0;
    89 }
     1 #include<stdio.h>
     2 #include<string.h>
     3 #define Max 0xfffffff
     4 int n,m,s,e,map[160][160];
     5 char name[160][32];
     6 int find(char str[30])
     7 {
     8     int i;
     9     for(i=1;i<=m;i++)
    10     {
    11         if(strcmp(name[i],str)==0)
    12             return i;
    13     }
    14     if(m==0||i>m)
    15     {
    16         ++m;
    17       strcpy(name[m],str); 
    18      
    19       return m;
    20     }
    21 }
    22 int min(int x,int y)
    23 {
    24     return x>y?y:x;
    25 }
    26 void getmap()
    27 {
    28     int a,b,i,j,l;
    29     char s1[40],s2[40];
    30     for(i=0;i<n;i++)
    31         for(j=0;j<n;j++)
    32             map[i][j]=(i==j?0:Max);
    33         for(i=0;i<n;i++)
    34         {
    35             scanf("%s%s%d",&s1,&s2,&l);
    36               a=find(s1);
    37               b=find(s2);
    38             map[a-1][b-1]=map[b-1][a-1]=min(map[a-1][b-1],l);
    39         }
    40 }
    41 void floyd(int s,int e)
    42 {
    43     int i,j,k;
    44     for(k=0;k<n;k++)
    45         for(i=0;i<n;i++)
    46             for(j=0;j<n;j++)
    47                 map[i][j]=min(map[i][j],map[i][k]+map[k][j]);
    48              printf("%d
    ",map[s][e]<Max?map[s][e]:-1);
    49             
    50 }
    51 int main()
    52 {
    53      while(~scanf("%d",&n)&&n>0)
    54      {
    55          if(n==-1)
    56             break;
    57         char start[40],end[40];
    58         scanf("%s%s",start,end);
    59          s=find(start)-1;
    60          e=find(end)-1;
    61          getmap();
    62         floyd(s,e);
    63         
    64     }
    65     return 0;
    66 }

     再次重新做这个题目写的代码ac:

    #include<stdio.h>
    #include<string.h>
    #define INF 0xfffffff
    int m,map[2600][2600],mark[2600];
    int n,s,e;
    long f[2600];
    char name[2600][32];
    int find(char str[32])
    {
    	int i;
    	for(i=0;i<m;i++)
    	{
    		if(strcmp(str,name[i])==0)
    		     return i;
    	}
    	if(m==0||i==m)
    	{
    		strcpy(name[i],str);
    		   m++;
    		 return i;
    	}
    }
    void dijkstra()
      {
          int i,j,k,min;
          memset(mark,0,sizeof(mark));
         for(i=0;i<n;i++)
             f[i]=map[s][i];
         f[s]=0;
         for(i=0;i<m;i++)
         {
             min=INF;
             for(j=0;j<m;j++)
             {
                if(!mark[j]&&min>f[j])
                {
                       k=j;
                     min=f[j];
                 }
             }
             if(min==INF)break;
             mark[k]=1;
             for(j=0;j<n;j++)
                 if(!mark[j]&&f[j]>f[k]+map[k][j])
                 f[j]=map[k][j]+f[k];
        }
         if(f[e]!=INF) printf("%ld
    ",f[e]);
         else printf("-1
    ");
     }
     int main()
     {
    	 int i,j,x,y,time;
      while(~scanf("%d",&n)&&n!=-1)
      {    
    	          m=0;
    	    char start[50],end[50],from[50],to[50];
    		scanf("%s%s",start,end);
    		  s=find(start);
    		  e=find(end);
    		  for(i=0;i<160;i++)
    			  for(j=0;j<160;j++)
    				   if(i==j)
    					   map[i][j]=map[j][i]=0;
    				   else
    					   map[i][j]=map[j][i]=INF;
             for(i=0;i<n;i++)
    		 {
    			 scanf("%s%s%d",from,to,&time);
                  x=find(from);
    			  y=find(to);
                 map[x][y]=map[y][x]=time;
    		 }
    		 if(s==e)
    			 printf("0
    ");
    		 else
                dijkstra();
      }
      return 0;
     }
    
    
    
    
    
    
     
    
     
  • 相关阅读:
    hdu 1429 胜利大逃亡(续)(BFS+位压缩)
    hdu 2955 Robberies
    POJ—Building a Space Station
    POJ-1287 Networking
    POJ-1251 Jungle Roads
    BFS ZOJ problem-1671 Waking Ant
    POJ-1308 Is It A Tree?
    poj 1611The Suspects
    POJ Wireless Network
    POJ 2524 Ubiquitous Religions
  • 原文地址:https://www.cnblogs.com/cancangood/p/3357760.html
Copyright © 2011-2022 走看看