比赛 202110省实验桐柏一中普及组联赛 评测结果 RRRRRRRRRR
题目名称 旅游纪念 最终得分 0
用户昵称 zhuyixin 运行时间 0.005 s
代码语言 C++ 内存使用 7.84 MiB
提交时间 2021-10-18 18:59:33
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <queue>
#define ll long long 
using namespace std;
int n,m,head[100005],dis[50005],ans=1e9,cnt,u,v,w,caonm[50005],inq[50005];

struct node{
	int u,x,v;
}e[100005];

void add(int u,int v,int w){
	e[++cnt].u=v;
	e[cnt].x=w;
	e[cnt].v=head[u];
	head[u]=cnt;
}

int woc(int x){
	if(caonm[e[x].u]<caonm[x]) return caonm[x]-caonm[e[x].u];
	return 0;
}

void spfa(int x){
	queue<int> q;
	inq[x]=1;
	dis[x]=0;
	q.push(x);
	while(!q.empty()){
		int topp=q.front();
		inq[topp]=0;
		q.pop();
		for(int i=head[topp];i;i=e[i].v){
			int su=e[i].u,sx=e[i].x;
			if(dis[su]>dis[i]+sx+woc(i)){
				dis[su]=dis[i]+sx+woc(i);
				if(inq[su]==0){
					inq[su]=1;
					q.push(su);
				}
			}
		}
	}
}

int main(){
//	freopen("keepsake.in","r",stdin);
//	freopen("keepsake.out","w",stdout);
    cin >>n>>m;
    for(int i=1;i<=m;i++){
    	cin >>u>>v>>w;
    	add(u,v,w);
    }
    for(int i=1;i<=n;i++){
    	cin >>caonm[i];
    	dis[i]=1e9;
    }
	spfa(1);
	for(int i=1;i<=n;i++){
		cout <<dis[i]<<" ";
	}
    cout<<dis[n];
	return 0;
}