1 条题解

  • 1
    @ 2022-10-27 23:21:38

    首先,我们需要先将点的所有的编号弄出来,即

    int convert(char c){
        if(isupper(c)) return c-'A'+1;
        if(islower(c)) return c-'a'+27;
    }
    

    还是将大写字母转到1-26,小写转到27-52。

    现在我们需要使用Dijkstra算法,它的大致过程如下:

    如果有一个图G(V,E)G(V,E)VV的大小为nnEE的大小为mmss到其他点的最短路长用dis\text{dis}记。

    初始化dis\text{dis}数组(点ss到所有点的最短路径,除了$\text{dis}_{x\in V\text{ and }x\neq s}=\infty,\text{dis}_{s}=\infty$)并标记ss

    循环nn

    找到dis\text{dis}数组中未标记过且值最小的点的标号记为pp 标记pp 更新与pp点链接的所有的点的dis\text{dis}

    首先我们初始化dis\text{dis},并且将字符Z到自身的距离标为0。

    for(int i=1;i<=52;i++) dist[i]=inf;
    dist[convert('Z')]=0;
    

    然后,是Dijkstra算法:

    for(int i=1;i<=52;i++){
        int minn=inf,chosen=0;
        for(int j=1;j<=52;j++) if(!book[j]&&dist[j]<minn) minn=dist[chosen=j];
        book[chosen]=true;
        for(auto jt:edgs[chosen]) dist[jt.first]=min(dist[jt.first],jt.second+dist[chosen]);
    }
    

    最后输出即可。

    完整代码略!!!!!!

    • 1

    信息

    ID
    528
    时间
    1000ms
    内存
    512MiB
    难度
    3
    标签
    递交数
    7
    已通过
    2
    上传者