洛谷 P1529 回家 Bessie Come Home

题意

题目就是最短路的模型,求的是离‘Z’牧场最近的有牛的牧场的字母标号(就是牧场的名字)以及这座牧场到‘Z’距离

做法

要换位思考,将起始点设为‘Z’,一个个向外更新,可以将所有字母用一个自己写的ID函数将其化为序号,再读入距离时因为有多条路线,而我们要用的只有最短的那条,要min取最小的存入数组,其余可以舍去,用最短路模拟全部后,数组中存的就是标号为i的牧场到‘Z’牧场的距离,最后取最小值的时候,因为只有大写字母的牧场有牛,所以要将小写字母的牧场舍去后,for一遍即可

代码

#include<bits/stdc++.h>
using namespace std;
int f[55][55],d[55],v[55];
int id(char q)
{
    if(q<='Z') return q-'A'+1;
    return q-'a'+1+26;
} 
int main() 
{
    //freopen("comehome.in","r",stdin);
    //freopen("comehome.out","w",stdout);
    int n; 
    scanf("%d",&n);
    for(int i=1;i<=n;++i)
    {
        char a,b;
        int s;
        scanf(" %c %c%d",&a,&b,&s);
        int x=id(a);
        int y=id(b);
        f[x][y]=(f[x][y]?min(f[x][y],s):s);
        f[y][x]=f[x][y]; 
    }
    for(int i=1;i<=52;++i)
       d[i]=1e9;
    d[26]=0;
    for(int i=1;i<52;++i)
    {
        int ok=-1;
        for(int j=1;j<=52;++j)
          if(!v[j]&&(ok==-1||d[j]<d[ok]))
               ok=j;
        v[ok]=1;
        for(int j=1;j<=52;++j)
            if(f[ok][j])
               d[j]=min(d[j],d[ok]+f[ok][j]);
    } 
    int ans=1e9;
    char p;
    for(int i=1;i<26;++i)
    {
        if(ans>d[i])
        {
            ans=d[i];
            p=i+'A'-1;
        }
    }
    printf("%c %d\n",p,ans);
    return 0;
}

 

posted @ 2022-02-12 16:13  LikC1606  阅读(70)  评论(0)    收藏  举报