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\n");
69         else{
70             dijkstra(s, e);
71             if(dis[e] != maxint)
72                 printf("%ld\n", dis[e]);
73             else
74                 printf("-1\n");
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\n",f[e]);
68     else printf("-1\n");
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\n");
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\n",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\n",f[e]);
     else printf("-1\n");
 }
 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\n");
		 else
            dijkstra();
  }
  return 0;
 }






 

 

 
posted @ 2013-10-08 20:24  疯狂的癫子  阅读(187)  评论(0编辑  收藏  举报