求助:Dijkstra 模板 TLE
查看原帖
求助:Dijkstra 模板 TLE
1166052
Craft_Mine楼主2024/10/9 12:41

代码:

#include <bits/stdc++.h>
#define MaxPointNum 100000
#define MaxEdgeNum 200000
#define inf 2147483647
using namespace std;

int to[MaxEdgeNum+5],nxt[MaxEdgeNum+5],wgt[MaxEdgeNum+5];
int n,m,srt,cnt;

struct node{
	int fst,dis;
	bool vis;
	bool operator <(const node x)const{
		return dis<x.dis;
	} 
}pnt[MaxPointNum+5];

void add(int u,int v,int w){
	to[++cnt]=v;
	wgt[cnt]=w;
	nxt[cnt]=pnt[u].fst;
	pnt[u].fst=cnt;
}

void dijkstra(){
	for(int i=1;i<=n;i++) pnt[i].dis=inf;
	priority_queue<node> que;
	pnt[srt].dis=0;
	que.push(pnt[srt]);
	while(que.size()){
		node u=que.top();
		que.pop();
		if(u.vis) continue;
		u.vis=true;
		for(int i=u.fst;i;i=nxt[i]){
			int v=to[i];
			if(u.dis+wgt[i]<pnt[v].dis){
				pnt[v].dis=u.dis+wgt[i];
				if(!pnt[v].vis) que.push(pnt[v]);
			}
		}
	}
}

int main(){
	scanf("%d%d%d",&n,&m,&srt);
	for(int i=0;i<m;i++){
		int u,v,w;
		scanf("%d%d%d",&u,&v,&w);
		add(u,v,w);
	}
	dijkstra();
	for(int i=1;i<=n;i++) printf("%d ",pnt[i].dis);
	return 0;
}

链式前向星 + 堆优化 Dijkstra

2024/10/9 12:41
加载中...