题目链接:HUD-2112 HDU Today

HDU Today

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

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


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

思路:

1.最短路spfa模板.

2.map标记建图.

3.考虑距离为0或者-1的情况.

总结:下次map记得清空orz。

AC代码:

 1 #include<cstdio>
 2 #include<map>
 3 #include<iostream>
 4 #include<queue>
 5 using namespace std;
 6 const int INF = 0x3f3f3f3f;
 7 const int maxn = 155;
 8 int Map[maxn][maxn];
 9 int n;
10 int d[maxn];
11 int vis[maxn];
12 void spfa(int s,int n)
13 {
14     queue<int> q;
15     for(int i = 1;i <= n;i++)
16     {
17         d[i] = INF;
18         vis[i] = 0;
19     }
20     d[s] = 0;
21     vis[s] = 1;
22     q.push(s);
23     while(!q.empty())
24     {
25         int k = q.front();q.pop();
26         vis[k] = 0;
27         for(int j = 1;j <= n;j++)
28         {
29             if(d[k] + Map[k][j] < d[j])
30             {
31                 d[j] = d[k] + Map[k][j];
32                 if(!vis[j])
33                     q.push(j),vis[j] = 1;
34             }
35         }
36     }
37 }
38 void init()
39 {
40     for(int i = 0;i <= 150;i++)
41     {
42         for(int j = 0;j <= i;j++)
43         {
44             if(j != i)
45             Map[i][j] = Map[j][i] = INF;
46             else Map[i][j] = 0;
47         }
48     }
49 }
50 int main()
51 {
52     char a[50],b[50];
53     map<string,int> mp;
54     char st[50],ed[50];
55     int w;
56     while(~scanf("%d",&n) && n!= -1)
57     {
58         init();//初始化
59         mp.clear();
60         int count = 0;//用于map一对一转化;
61         scanf("%s%s",&a,&b);
62         mp[a] = ++count;
63         if(!mp[b]) mp[b] = ++count;//如果终点未出现过,则加入图中;
64         for(int i = 0;i < n;i++)
65         {
66             scanf("%s %s %d",&st,&ed,&w);
67             if(!mp[st]) mp[st] = ++count;//检查两点是否出现过
68             if(!mp[ed]) mp[ed] = ++count;
69             int u = mp[st],v = mp[ed];
70             Map[u][v] = Map[v][u] = w;//建图;
71         }
72         spfa(1,count);
73         if(d[ mp[b] ] == INF) printf("-1\n");
74         else printf("%d\n",d[ mp[b] ]);
75     }
76     return 0;
77 }

 

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄