[CF938D] Buy a Ticket – 最短路,建图

\(n\) 个城市开演唱会,这 \(n\) 个城市的人都想去听演唱会,每个城市的票价不同,于是这些人就想是否能去其他城市听演唱会更便宜(去回都要路费)

Solution

设演唱会为 \(0\) 号点

连边 \(0 \to i\),对于一对可达的城市,连边 \(u \leftrightarrow v\)

跑最短路即可

#include <bits/stdc++.h>
using namespace std;
#define reset3f(x) memset(x,0x3f,sizeof x)
#define int long long
namespace sp {
const int N=1e+6+5;
vector<pair<int,int> > g[N];
int n,v0=1,d[N];
void make(int t1,int t2,int t3) {
    g[t1].push_back(make_pair(t2,t3));
}
void reset_graph() {
    for(int i=0;i<=n;i++) g[i].clear();
}
void solve() {
    priority_queue<pair<int,int> > qu;
    reset3f(d);
    d[v0]=0;
    qu.push(make_pair(0,v0));
    while(qu.size()) {
        int p=qu.top().second,r=qu.top().first;
        qu.pop();
        if(r+d[p]) continue;
        for(int i=0;i<g[p].size();i++) {
            int q=g[p][i].first,w=g[p][i].second;
            if(d[q]>d[p]+w) {
                d[q]=d[p]+w;
                qu.push(make_pair(-d[q],q));
            }
        }
    }
}
}

int n,m,t1,t2,t3;

signed main() {
    ios::sync_with_stdio(false);
    cin>>n>>m;
    for(int i=1;i<=m;i++) {
        cin>>t1>>t2>>t3;
        t3*=2;
        sp::make(t1,t2,t3);
        sp::make(t2,t1,t3);
    }
    for(int i=1;i<=n;i++) {
        cin>>t1;
        sp::make(0,i,t1);
    }
    sp::v0=0;
    sp::solve();
    for(int i=1;i<=n;i++) cout<<sp::d[i]<<" ";
}

原文链接: https://www.cnblogs.com/mollnn/p/12587111.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    [CF938D] Buy a Ticket - 最短路,建图

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/338457

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月1日 下午11:37
下一篇 2023年3月1日 下午11:37

相关推荐