• 回家


    现在是晚餐时间,而母牛们在外面分散的牧场中。 农民约翰按响了电铃,所以她们开始向谷仓走去。 你的工作是要指出哪只母牛会最先到达谷仓(在给出的测试数据中,总会有且只有一只最快的母牛)。 在挤奶的时候(晚餐前),每只母牛都在她自己的牧场上,一些牧场上可能没有母牛。 每个牧场由一条条道路和一个或多个牧场连接(可能包括自己)。 有时,两个牧场(可能是字母相同的)之间会有超过一条道路相连。 至少有一个牧场和谷仓之间有道路连接。 因此,所有的母牛最后都能到达谷仓,并且母牛总是走最短的路径。 当然,母牛能向着任意一方向前进,并且她们以相同的速度前进。 牧场被标记为'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
  • 相关阅读:
    千万别用树套树 【题意:有多少线段完全覆盖某一线段【树状数组维护】】【模板题】
    Codeforces Round #590 (Div. 3)【D题:26棵树状数组维护字符出现次数】
    Codeforces Round #590 (Div. 3)【D题:维护26棵树状数组【好题】】
    Codeforces Round #350 (Div. 2) A B C D1 D2 水题【D2 【二分+枚举】好题】
    AtCoder Beginner Contest 142【D题】【判断素数的模板+求一个数的因子的模板】
    AtCoder Beginner Contest 116 D
    序列自动机【模板】
    题解 CF1428G Lucky Numbers (Easy Version and Hard Version)
    题解 CF1428F Fruit Sequences
    题解 P5401 [CTS2019]珍珠
  • 原文地址:https://www.cnblogs.com/adelalove/p/9195887.html
Copyright © 2020-2023  润新知