比赛 |
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;
}