1 条题解
-
1
首先,我们需要先将点的所有的编号弄出来,即
int convert(char c){ if(isupper(c)) return c-'A'+1; if(islower(c)) return c-'a'+27; }
。
还是将大写字母转到1-26,小写转到27-52。
现在我们需要使用Dijkstra算法,它的大致过程如下:
如果有一个图且的大小为而的大小为,到其他点的最短路长用记。
初始化数组(点到所有点的最短路径,除了$\text{dis}_{x\in V\text{ and }x\neq s}=\infty,\text{dis}_{s}=\infty$)并标记。
循环遍
找到数组中未标记过且值最小的点的标号记为 标记 更新与点链接的所有的点的值
首先我们初始化,并且将字符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
- 上传者