luogu P2009 跑步

原题链接:https://www.luogu.org/problem/show?pid=2009

做这道题的时候,看了一眼数据范围,n<=20,额,一般的Floyd不应该是100—200左右的吗,这个不会是有什么其他算法吧。。。

仔细审题后,好像没啥问题,直接字符转数字,Floyd直接上,然后就华丽的GG了,50分。

因为此题有可能有自环,而且每条边都只要最大值,于是就在前面加了一个特判边权不为无限大的时候,就取最大值。

然而还是不对,仔细看了半天,没看出错来,把手打的一串9改成常量inf后,居然A了,事后才发现,填数组的时候有8个9,判断的时候只输入了7个9。。。。。。

总体算法不难,注意好一些细节,就是个Floyd板子题

#include<cstdio>
const int inf=9999999;
int e[25][25],w,n,m;
char s[5],t[5];
int max(int x,int y)
{
    return x>y ? x : y;
}
int min(int x,int y)
{
    return x<y ? x : y;
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            if(i!=j) e[i][j]=inf;
        }
    }
    for(int i=1;i<n;i++)
    {
        scanf("%d",&e[i][i+1]);
        e[i+1][i]=e[i][i+1];
    }
    scanf("%d",&e[n][1]);e[1][n]=e[n][1];
    for(int i=1;i<=m;i++)
    {
        scanf("%s %s %d",s,t,&w);
        int x=s[0]-'A'+1,y=t[0]-'A'+1;
        if(e[x][y]!=inf) e[x][y]=max(e[x][y],w);
        else e[x][y]=w;
        e[y][x]=e[x][y];
    }
    for(int k=1;k<=n;k++)
    {
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                e[i][j]=min(e[i][j],e[i][k]+e[k][j]);
                e[j][i]=e[i][j];
            }
        }
    }
    scanf("%s %s",s,t);
    int x=s[0]-'A'+1,y=t[0]-'A'+1;
    printf("%d",e[x][y]);
    return 0;
}
原文地址:https://www.cnblogs.com/zeroform/p/7582104.html