关于Dijkstra算法的疑惑
查看原帖
关于Dijkstra算法的疑惑
1051584
Crushxl楼主2023/8/9 13:46

初学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

2023/8/9 13:46
加载中...