现在是晚餐时间,而母牛们在外面分散的牧场中。 农民约翰按响了电铃,所以她们开始向谷仓走去。 你的工作是要指出哪只母牛会最先到达谷仓(在给出的测试数据中,总会有且只有一只最快的母牛)。 在挤奶的时候(晚餐前),每只母牛都在她自己的牧场上,一些牧场上可能没有母牛。 每个牧场由一条条道路和一个或多个牧场连接(可能包括自己)。 有时,两个牧场(可能是字母相同的)之间会有超过一条道路相连。 至少有一个牧场和谷仓之间有道路连接。 因此,所有的母牛最后都能到达谷仓,并且母牛总是走最短的路径。 当然,母牛能向着任意一方向前进,并且她们以相同的速度前进。 牧场被标记为'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)。 输出格式: 单独的一行包含二个项目: 最先到达谷仓的母牛所在的牧场的标记,和这只母牛走过的路径的长度。 输入输出样例 输入样例#1: 5 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