CodeForces - 938D Buy a Ticket

Posted 采蘑菇的小西佬

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CodeForces - 938D Buy a Ticket相关的知识,希望对你有一定的参考价值。

传送门: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的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces 938D Buy a Ticket (转化建图 + 最短路)

Codeforces 938D Buy a Ticket spfa优化

最短路 || Codeforces 938D Buy a Ticket

CF938D Buy a Ticket

CF938D Buy a Ticket dijkstra

CF938D Buy a Ticket