大佬们求帮调,跪了
查看原帖
大佬们求帮调,跪了
225287
123321V楼主2023/10/14 19:38
#include <iostream>
#include <cstdio>
#include <string.h>
using namespace std;

int hea[100005],nex[200005],toe[200005],qz[200005];
bool hx[100005];
int di[100005],du[5000005],tn,tt,n,m,s;

void rd(int k){
	du[++tt]=k;
	int l=tt;
	while(l>1){
		int q=(l>>1);
		if(di[du[l]]>=di[du[q]]) l=1;
		else{
			swap(du[l],du[q]);
			l=q;
		}
	}
	return ;
}

int cd(){
	int jg=du[1],l=1;
	du[1]=du[tt--];
	while(l*2<=tt){
		int q=(l<<1);
		if(di[du[q]]>di[du[q+1]]) q++;
		if(di[du[l]]<=di[du[q]]) l=tt;
		else{
			swap(du[l],du[q]);
			l=q;
		}
	}
	return jg;
}
                               
void qxx(int a,int b,int c){
	nex[++tn]=hea[a];
	toe[tn]=b;
	qz[tn]=c;
	hea[a]=tn;
	return ;
}

int main(){
	scanf("%d%d%d",&n,&m,&s);
	for(int i=1;i<=m;i++){
		int a,b,c;
		scanf("%d%d%d",&a,&b,&c);
		qxx(a,b,c);
	}
	memset(di,127,sizeof(di));
	di[s]=0;rd(s);
	while(tt>0){
		int k=cd();
		if(!hx[k]){
			hx[k]=1;
			for(int j=hea[k];j;j=nex[j]){
				if(!hx[toe[j]]){
					int l=qz[j]+di[k];
					if(l<di[toe[j]]){
						di[toe[j]]=l;
						rd(toe[j]);
					}
				}
			}
		}
	}
	for(int i=1;i<=n;i++) printf("%d ",di[i]);
	return 0;
}
2023/10/14 19:38
加载中...