HDU

题目:

HDU Today

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


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
虽然偶尔会迷路,但是因为有了你的帮助 **和**从此还是过上了幸福的生活。
――全剧终――
 
  题意很简单,最短路结合map来做的话比较简单,敲了个spfa然后把其他都写好,然后交上去,结果用G++就一直WA,用C++就一直越界,由于我用的是邻接表来实现,所以出现重边的情况其实不用像用邻接矩阵那样还需要判断在赋值,同时数据不是很大,点只有160,边不大于10000。后来发现了当起点和终点相同的时候需要输出0。这里改掉以后交上去还是RE,检查了一遍代码没有其他问题,可是还是RE。然后结合越界的情况想了一下,会不会题目说的边的数目不大于10000的意思是点之间的联系最多10000,但是这些联系是不包括重边的,意思就是去掉重复的边,出现过边的地方只保留一条边以后剩余的边最多只有10000。于是把静态链表的大小扩大了5倍,然后就过了= =。如果用的是邻接矩阵的话就不会出现这种情况了,看来以后如果使用静态链表的话要考虑如果会出现同一变量要出现多次这种情况,容量要适当增大,不过我觉得这只可以对付比较弱的数据,如果是比较强的数据还是用指针链表比较好,不过如果用指针链表的话还要考虑释放的问题。
 
代码:
 
 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 #include <queue>
 5 #include <string>
 6 #include <map>
 7 #define INF 1000000000
 8 #define MAX 50010
 9 using namespace std;
10 
11 typedef struct
12 {
13     int to,next,l;
14 }node;
15 
16 node N[MAX];
17 int head[1005],dis[1005],tot,n;
18 bool vin[1005];
19 
20 void add(int u,int v,int len)
21 {
22     N[tot].to=v; N[tot].next=head[u]; N[tot].l=len; head[u]=tot++;
23 }
24 
25 map<string,int> M;
26 
27 void Init()
28 {
29     memset(N,0,sizeof(N));
30     memset(head,-1,sizeof(head));
31     M.clear();
32     tot=0;
33 }
34 
35 void spfa(int st)
36 {
37     int i,u;
38     memset(vin,0,sizeof(vin));
39     queue<int> q;
40     for(i=1;i<=n;i++) dis[i]=INF;
41     dis[st]=0;
42     q.push(st);
43     vin[st]=1;
44     while(!q.empty())
45     {
46         u=q.front();
47         q.pop();
48         vin[u]=0;
49         for(i=head[u];i!=-1;i=N[i].next)
50         {
51             int len;
52             len=dis[u]+N[i].l;
53             if(dis[N[i].to]>len)
54             {
55                 dis[N[i].to]=len;
56                 if(!vin[N[i].to])
57                 {
58                     q.push(N[i].to);
59                     vin[N[i].to]=1;
60                 }
61             }
62         }
63     }
64 }
65 
66 
67 
68 int main()
69 {
70     int i,st,ed,t,len,a,b;
71     string s,s1,s2;
72     //freopen("data.txt","r",stdin);
73     while(scanf("%d",&t),t>=0)
74     {
75         Init();
76         n=1;
77         cin>>s;
78         st=n;
79         ed=n;
80         M[s]=n++;
81         cin>>s;
82         if(M.count(s)<=0) { ed=n; M[s]=n++;}
83         for(i=0;i<t;i++)
84         {
85             cin>>s1>>s2>>len;
86             if(M.count(s1)<=0) M[s1]=n++;
87             if(M.count(s2)<=0) M[s2]=n++;
88             a=M[s1];
89             b=M[s2];
90             add(a,b,len);
91             add(b,a,len);
92         }
93         n--;
94         spfa(st);
95         if(dis[ed]<INF) printf("%d
",dis[ed]);
96         else printf("-1
");
97     }
98     return 0;
99 }
2112 spfa 邻接表
 
 
原文地址:https://www.cnblogs.com/sineatos/p/3301768.html