关于单源最短路 dijkstra
  • 板块学术版
  • 楼主lajhehe666233
  • 当前回复3
  • 已保存回复3
  • 发布时间2022/7/28 15:07
  • 上次更新2023/10/27 18:00:51
查看原帖
关于单源最短路 dijkstra
542924
lajhehe666233楼主2022/7/28 15:07

因为队列中处理过的已经最短,所以可以不用处理连接到的 并且处理过的点

那么continue 一行就可以注释掉

只需要在已经处理过的点标记vis就可以了,所以本人注释掉了多余部分

看了很多算法讲解都有这个,很不理解。。。

#include<stdio.h>
#include<queue>
#include<algorithm>
#include<vector>
#define int long long
using namespace std;
int n,m,maxn;
int dist[2505];
bool vis[2505];
struct edge{
	int to,w;
};
vector<edge>e[2505];
struct node{
	int dis,pos;
	bool operator < (const node &a) const{
		return a.dis<dis;
	}
};
priority_queue<node>q;
void init(){
	for(int i=1;i<=n;i++){
		dist[i]=maxn;
		vis[i]=0;
	}
	dist[1]=0;
}
void dij(){
	q.push({0,1});
	while(!q.empty()){
		node tmp=q.top();
		q.pop();
		int f=tmp.pos;
	//	if(vis[f]) continue;
		vis[f]=1;
		for(int i=0;i<e[f].size();i++){
			int t=e[f][i].to;
			if(!vis[t]){
				if(dist[t]>dist[f]+e[f][i].w){
					dist[t]=dist[f]+e[f][i].w;
				
					q.push({dist[t],t});
				}
			}
		}
	}
}
signed main(){
	maxn=0x7fffffff;
	scanf("%d%d",&n,&m);
	init();
	for(int i=1;i<=m;i++){
		int f,t,v;
		scanf("%d%d%d",&f,&t,&v);
		e[f].push_back({t,v});
		e[t].push_back({f,v});
	}
	dij();
	printf("%d",dist[n]);
	
}
2022/7/28 15:07
加载中...