迪杰斯特拉堆优化20分求调
查看原帖
迪杰斯特拉堆优化20分求调
638832
XXCCVV楼主2023/3/16 13:43
#include<algorithm>
#include<iostream>
#include<iomanip>
#include<cstring>
#include<vector>
#include<cmath>
#include<stack>
#include<queue>
#include<map>
#include<set>
using namespace std;

struct edge{
	int to,w,next;
}edges[1000005];

int  n,m,s,cnt=0;
int vis[10005],dis[10005],head[100005];

void eddEdge(int u,int v,int w){
	edges[++cnt].to=v;
	edges[cnt].w=w;
	edges[cnt].next=head[u];
	head[u]=cnt;
}

void dij(int s){
	priority_queue <int,vector<int>,greater<int>> que;
	memset(dis,0x3f,sizeof(dis));
	dis[s]=0;
	que.push(s);
	while(!que.empty()){
		int st=que.top();
		que.pop();
		if(vis[st]){
			continue;
		}
		vis[st]=1;
		for(int i=head[st];i!=0;i=edges[i].next){
			int to=edges[i].to;
			dis[to]=min(dis[to],dis[st]+edges[i].w);
			que.push(to);
		}
	}
}

int main(){
	cin>>n>>m>>s;
	for(int i=1;i<=m;i++){
		int u,v,w;
		cin>>u>>v>>w;
		eddEdge(u,v,w);
	}
	dij(s);
	for(int i=1;i<=n;i++){
		int cc=pow(2,31)-1;
		if(dis[i]==0x3f3f3f3f){
			cout<<cc<<" ";
		}else{
			cout<<dis[i]<<" "; 
		}
	}
	return 0;
}

测评

2023/3/16 13:43
加载中...