Dijkstra 10分求调
查看原帖
Dijkstra 10分求调
1273558
Flax_shiep楼主2025/1/17 10:34
#include<cstdio>
#include<algorithm>
using namespace std;
struct ed{
	long long u,val,nxt;
};
long long n,m,s,tot;
long long head[1000010],dis[1000010];
ed side[2000010];
bool mark[1000010];
void add(long long u,long long v,long long w){
	if(head[u])side[tot+1].nxt=head[u];
	head[u]=++tot;
	side[tot].u=v;
	side[tot].val=w;
}
void song_chi(long long pos){
	long long x=pos;
	pos=head[pos];
	while(side[pos].nxt){
		dis[side[pos].u]=min(dis[side[pos].u],dis[x]+side[pos].val);
		pos=side[pos].nxt;
	}
	dis[side[pos].u]=min(dis[side[pos].u],dis[x]+side[pos].val);
	mark[x]=1;
}
void get_ans(){
	for(long long i=1;i<=n;i++){
		if(i==1)mark[s]=1;
		else{
			long long u=0;
			for(long long j=1;j<=n;j++){
				if(!mark[j]&&(!u||dis[j]<dis[u]))u=i;
			}
			song_chi(u);
		}
	}
}
void put_ans(){
	for(long long i=1;i<=n;i++){
		printf("%lld ",dis[i]);
	}
}
int main(){
	scanf("%lld%lld%lld",&n,&m,&s);
	for(long long i=1;i<=n;i++){
		dis[i]=2147483647;
	}
	dis[s]=0;
	for(long long i=0;i<m;i++){
		long long x,y,z;
		scanf("%lld%lld%lld",&x,&y,&z);
		if(x==s)dis[y]=z;
		add(x,y,z);
	}
	get_ans();
	put_ans();
	return 0;
}
2025/1/17 10:34
加载中...