初学Dijkstra单源最短路算法,于是也试着从终点反向跑,边权为经过该边花费的生命值。
边权与步数k有关,没法一开始都算出来,又考虑到简单连通图任意两点之间都连通,所以也就没开带权的邻接矩阵,只定义了dis/check两个数组维护,attack二维数组存储两点之间怪物的攻击力。
代码如下:
#include <bits/stdc++.h>
using namespace std;
const int inf=0x3f3f3f3f,N=5005;
int n,m,s,t,k,dis[N],check[N],attack[N][N];
void dijkstra(){
memset(dis,inf,sizeof(dis));
dis[t] = 0;
for(int i=1;i<=n;i++){
int minn=inf,minx;
for(int j=1;j<=n;j++){
if(dis[j]<minn && check[j]==0){ //选定dis最小且没走过的点
minn = dis[j];
minx = j;
}
}
k++; //魔力值+1
check[minx] = 1; //该点标记为已走过
for(int j=1;j<=n;j++){ //更新该点周围所有点的dis
int cost = attack[minx][j]/k; //实时计算边权
if(minn + cost < dis[j]){
dis[j] = minn + cost;
}
}
}
}
int main(){
cin >> n >> m >> s >> t;
for(int i=0;i<m;i++){
int x,y,w;
cin >> x >> y >> w;
attack[x][y] = w;
attack[y][x] = w;
}
dijkstra();
cout << dis[s]; //输出ans(即起点s到源点(终点t)的最小代价)
return 0;
}
代码通过了Subtask1,Subtask2 WA。其他测试点RE。 个人觉得挂掉的原因可能是题目说明边可以重复走多次,而代码中打上check的点就不会再经过了。但我自己修改了算法规则问题似乎还是存在。
想知道问题出在哪里,可以在保持Dijkstra算法框架的前提下,提出一些修改建议吗xdddd