Dijkstra求助
查看原帖
Dijkstra求助
720872
_UniqueGirl_楼主2024/4/8 21:03

rt,TLE 1、2、3、5,WA 4

#include<bits/stdc++.h>
#define int long long
using namespace std;
struct Edge{
	int to,next,w;
}edge[200005];

struct Node{
	int x,y;
	friend bool operator < (Node a,Node b){
		return a.y>b.y;
	}
};

int head[1000005],num,n,m,s,u,v,w;
int d[1000005],f[1000005];
priority_queue<Node> q;

void add_Edge(int from,int to,int w){
	edge[num++]=(Edge){to,w,head[from]};
	head[from]=num;
}
void dij(int s){
	memset(d,0x3f,sizeof(d));
	for(int i=head[s];i;i=edge[i].next)
		d[edge[i].to]=edge[i].w;
	d[s]=0,f[s]=1;
	while(!q.empty()){//O(m)
		int x=q.top().x;q.pop();
		if(f[x]==1) continue; 
		f[x]=1;
		for(int i=head[x];i;i=edge[i].next) {
			if(d[edge[i].to]>d[x]+edge[i].w){
				d[edge[i].to]=d[x]+edge[i].w;
				q.push((Node){edge[i].to,d[edge[i].to]});
			}
		}
	}
	for(int i=1;i<=n;i++){
		if(d[i]==0x3f3f3f3f)
			cout<<2147483647<<" ";
		else cout<<d[i]<<" ";
	}
}

signed main(){
	cin>>n>>m>>s;
	for(int i=1;i<=m;i++){
		cin>>u>>v>>w;
		add_Edge(u,v,w);
		if(u==s) q.push((Node){v,w});
	}
	dij(s);
	return 0;
}
2024/4/8 21:03
加载中...