回家

现在是晚餐时间,而母牛们在外面分散的牧场中。 农民约翰按响了电铃,所以她们开始向谷仓走去。 你的工作是要指出哪只母牛会最先到达谷仓(在给出的测试数据中,总会有且只有一只最快的母牛)。 在挤奶的时候(晚餐前),每只母牛都在她自己的牧场上,一些牧场上可能没有母牛。 每个牧场由一条条道路和一个或多个牧场连接(可能包括自己)。 有时,两个牧场(可能是字母相同的)之间会有超过一条道路相连。 至少有一个牧场和谷仓之间有道路连接。 因此,所有的母牛最后都能到达谷仓,并且母牛总是走最短的路径。 当然,母牛能向着任意一方向前进,并且她们以相同的速度前进。 牧场被标记为'a'..'z''A'..'Y',在用大写字母表示的牧场中有一只母牛,小写字母中则没有。 谷仓的标记是'Z',注意没有母牛在谷仓中。
注意'm''M'不是同一个牧场 否则错误 上面的意思是说:输入数据中可能会同时存在M,m(郁闷ing)(PS:表郁闷…告诉我set of咋用就不郁闷了…),比如
M a a m m z
输入输出格式
输入格式:
第 1 行: 整数 P(1<= P<=10000),表示连接牧场(谷仓)的道路的数目。
第 2 ..P+1行: 用空格分开的两个字母和一个整数:
被道路连接牧场的标记和道路的长度(1<=长度<=1000)。
输出格式:
单独的一行包含二个项目: 最先到达谷仓的母牛所在的牧场的标记,和这只母牛走过的路径的长度。
输入输出样例
输入样例#15
A d 6
B d 3
C e 9
d Z 8
题目描述

是很简单的最短路模板题,用spfa()求出每个点

到Z的距离,然后找出最短的并且有奶牛的牧场的

位置和距离即可。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cmath>
 5 #include<cstring>
 6 #include<string>
 7 #include<queue>
 8 using namespace std;
 9 const int N=1e5+10;
10 int h[N],n,m,tot;
11 char a[3],b[3];
12 struct node{
13     int v,c,ne;
14 }e[N];
15 void add(int u,int v,int c)
16 {
17     tot++;e[tot]=(node){v,c,h[u]};h[u]=tot;
18 }
19 int ID(char c) 
20 {
21     if(c>='A' && c<='Z') return c-'A'+1;
22     return c-'a'+30+1;
23 }
24 int ff,rr,d[N],v[N],zz,l;
25 queue<int>q;
26 void spfa()
27 {
28     q.push(ID('Z'));v[ID('Z')]=1;
29     memset(d,24,sizeof(d));d[ID('Z')]=0; 
30     l=d[0];
31     while(!q.empty())
32     {
33         ff=q.front();q.pop();v[ff]=0;
34         for(int i=h[ff];i;i=e[i].ne)
35         {
36             rr=e[i].v;
37             if(d[rr]>d[ff]+e[i].c)
38             {
39                 d[rr]=d[ff]+e[i].c;
40                 if(!v[rr])
41                   v[rr]=1,q.push(rr);
42             }
43         }
44     }
45     for(int i=1;i<=60;++i)
46      if(d[i]<l && d[i]>0 && i<=30) l=d[i],zz=i;
47 }
48 int main()
49 {
50     scanf("%d",&m);
51     for(int i=1,k;i<=m;++i)
52     {
53         scanf("%s%s",a,b);scanf("%d",&k);
54         add(ID(a[0]),ID(b[0]),k);
55         add(ID(b[0]),ID(a[0]),k);
56     }
57     spfa();
58     if(zz<=30) cout<<char(zz-1+'A');
59     else cout<<char(zz-31+'a');
60     cout<<" "<<l;
61     return 0;
62 }
63  
View Code

 

posted @ 2018-06-18 19:33  月亮茶  阅读(139)  评论(0编辑  收藏  举报