1. 程式人生 > >CodeForces - 938D Buy a Ticket

CodeForces - 938D Buy a Ticket

add efi 圖片 cto ret clas 賦值 每一個 題意

傳送門:CodeForces - 938D

題意:n個城市,m條路,每條路都有自己的花費,每個城市看演唱會也有自己的花費,問從每一個城市到另一個城市(或就在自己城市)看演唱會的最小花費

題解:迪傑特斯拉,跑多源(每個源有權值)最短路。和一般的跑法不一樣,要先給每個dis[]賦值成源的權值然後扔進dij裏面。

技術分享圖片

#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>
#define se second
#define fi first
#define
ll long long const double Pi=3.14159265; const int N=2e5+5; const ull base=163; using namespace std; int head[N]; bool vis[N]; ll dis[N]; int tot=1; int n,m; struct node{ int nx; int to; ll len; }e[2*N]; priority_queue<Pli,vector<Pli>,greater<Pli> >q; void add(int u,int
v,ll w){ e[tot].to=v; e[tot].len=w; e[tot].nx=head[u]; head[u]=tot++; } void dij(){ while(!q.empty()){ Pli now=q.top();q.pop(); ll p=now.fi; int u=now.se; if(dis[u]<p)continue; for(int i=head[u];i;i=e[i].nx){ int v=e[i].to;
if(dis[v]>dis[u]+e[i].len){ dis[v]=dis[u]+e[i].len; q.push(Pli(dis[v],v)); } } } } int main(){ scanf("%d %d",&n,&m); while(m--){ int u,v; ll w; scanf("%d %d %I64d",&u,&v,&w); add(u,v,2*w); add(v,u,2*w); } for(int i=1;i<=n;i++){ ll t; scanf("%lld",&t); dis[i]=t; q.push(Pli(t,i)); } dij(); for(int i=1;i<=n;i++)printf("%lld ",dis[i]); return 0; }

CodeForces - 938D Buy a Ticket