4 2
1 2 4
2 3 7
6 20 1 25
6 14 1 25
如图建图;
代码如下
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int N=2e5+50; 4 typedef long long ll; 5 struct ss 6 { 7 int u,v,next; 8 ll w; 9 }edg[N*5]; 10 int sumedg,head[N]; 11 void addedg(int u,int v,ll w) 12 { 13 edg[sumedg]=(ss){u,v,head[u],w}; 14 head[u]=sumedg++; 15 } 16 ll n,m,value[N]; 17 ll dis[N]; 18 bool vis[N]; 19 void spfa() 20 { 21 queue<int>q; 22 memset(vis,0,sizeof(vis)); 23 for(int i=0;i<n+10;i++) dis[i]=LONG_LONG_MAX; 24 q.push(0); 25 vis[0]=1; 26 dis[0]=0; 27 while(!q.empty()) 28 { 29 int now=q.front();q.pop();vis[now]=0; 30 for(int i=head[now];i!=-1;i=edg[i].next) 31 { 32 int v=edg[i].v; 33 long long w=edg[i].w; 34 35 if(dis[v]>dis[now]+w) 36 { 37 dis[v]=dis[now]+w; 38 if(!vis[v]) 39 { 40 q.push(v); 41 vis[v]=1; 42 } 43 } 44 } 45 } 46 47 } 48 int main() 49 { 50 scanf("%lld%lld",&n,&m); 51 memset(dis,0,sizeof(dis)); 52 for(ll i=0;i<n+10;i++) head[i]=-1; 53 for(ll i=0;i<m;i++) 54 { 55 int u,v;ll w; 56 scanf("%d%d%lld",&u,&v,&w); 57 addedg(u,v,w*2); 58 addedg(v,u,w*2); 59 } 60 for(ll i=1;i<=n;i++) 61 { 62 scanf("%lld",&value[i]); 63 addedg(0,i,value[i]); 64 addedg(i,0,value[i]); 65 } 66 spfa(); 67 for(ll i=1;i<=n;i++) 68 { 69 printf("%lld%c",dis[i],i==n?‘\n‘:‘ ‘); 70 } 71 return 0; 72 }
原文:https://www.cnblogs.com/sylvia1111/p/11884287.html