Codeforces 938 D. Buy a Ticket

D. Buy a Ticket

time limit per test

2 seconds

memory limit per test

256 megabytes

input

standard input

output

standard output

Musicians of a popular band "Flayer" have announced that they are going to "make their exit" with a world tour. Of course, they will visit Berland as well.

There are n cities in Berland. People can travel between cities using two-directional train routes; there are exactly m routes, i-th route can be used to go from city vi to city ui (and from ui to vi), and it costs wi coins to use this route.

Each city will be visited by "Flayer", and the cost of the concert ticket in i-th city is ai coins.

You have friends in every city of Berland, and they, knowing about your programming skills, asked you to calculate the minimum possible number of coins they have to pay to visit the concert. For every city i you have to compute the minimum number of coins a person from city i has to spend to travel to some city j (or possibly stay in city i), attend a concert there, and return to city i (if j ≠ i).

Formally, for every you have to calculate , where d(i, j) is the minimum number of coins you have to spend to travel from city i to city j. If there is no way to reach city j from city i, then we consider d(i, j) to be infinitely large.

Input

The first line contains two integers n and m (2 ≤ n ≤ 2·105, 1 ≤ m ≤ 2·105).

Then m lines follow, i-th contains three integers vi, ui and wi (1 ≤ vi, ui ≤ n, vi ≠ ui, 1 ≤ wi ≤ 1012) denoting i-th train route. There are no multiple train routes connecting the same pair of cities, that is, for each (v, u) neither extra (v, u) nor (u, v) present in input.

The next line contains n integers a1, a2, ... ak (1 ≤ ai ≤ 1012) — price to attend the concert in i-th city.

Output

Print n integers. i-th of them must be equal to the minimum number of coins a person from city i has to spend to travel to some city j (or possibly stay in city i), attend a concert there, and return to city i (if j ≠ i).

Examples

Input

4 21 2 42 3 76 20 1 25

Output

6 14 1 25 

Input

3 31 2 12 3 11 3 130 10 20

Output

12 10 12 

【题意】

给$$$n$$$个城市,$$$m$$$条无向边,以及所有的点权$$$a_i$$$,边权$$$w_{(i,j)}$$$,对每个结点$$$i$$$,求一个结点$$$j$$$,使得$$$2*d(i,j)+a_j$$$最小 -d(i,j)表示i到j的一条最短路径的花费

【思路】

可以这样理解点权:假想所有结点再走$$$a_i$$$可以到达一个最终点,把点权转化为这个结点到最终点的这条边的边权。再来看$$$2*d(i,j)+a_j$$$,如果抽象地看,把$$$2*d(i,j)$$$当做$$$i$$$到$$$j$$$的距离,而$$$a_j$$$是j到最终点的距离,就赋予了新的含义,要求的值可以看作从$$$i$$$到最终点的最短路,于是问题就转化为了单源最短路问题,用Dijkstra可以求解。

【注意】

为了方便Dijkstra的求解,可以预先把输入的边权直接翻倍

【代码】

#include<stdio.h>
#include<vector>
using std::vector;
#include<queue>
#include <functional>
using std::priority_queue;
using std::greater;
using std::pair;
using std::make_pair;
typedef long long LL;
#define N_max 200005
#define  mp(x,y) make_pair(x,y)

typedef pair<LL, int> PLi;
vector<PLi> node[N_max];

LL dis[N_max];
int vis[N_max] = { 0 };
int main() {
    int n, m;
    scanf("%d %d", &n, &m);
    int fr, to;
    LL val;
    for (int i = 0; i < m; ++i) {
        scanf("%d %d %lld", &fr, &to, &val);
        node[fr].push_back(mp(2*val, to));
        node[to].push_back(mp(2*val, fr));
    }
    for (int i = 1; i <= n; ++i) {
        scanf("%lld", &val);
        dis[i] = val;
    }
    priority_queue<PLi,vector<PLi>,greater<PLi>> help;
    for (int i = 1; i <= n; i++)
        help.push(mp(dis[i], i));
    while (!help.empty())
    {
        PLi    cur = help.top(); help.pop();
        if (vis[cur.second] == 1)continue;
        vis[cur.second] = 1;

            int nadd = cur.second;
            int sz = node[nadd].size();
            for (int i = 0; i < sz; ++i) {
                PLi next = node[nadd][i];
                if (dis[nadd] + next.first < dis[next.second]) {
                    dis[next.second] = dis[nadd] + next.first;
                    help.push(mp(dis[next.second], next.second));
                }
            }
    }
    for (int i = 1; i <= n; i++)
        printf("%lld ", dis[i]);
    return 0;
}

原文地址:https://www.cnblogs.com/tobyw/p/9170648.html

时间: 2024-11-08 22:26:53

Codeforces 938 D. Buy a Ticket的相关文章

Codeforces 938 D. Buy a Ticket (dijkstra 求多元最短路)

题目链接:Buy a Ticket 题意: 给出n个点m条边,每个点每条边都有各自的权值,对于每个点i,求一个任意j,使得2×d[i][j] + a[j]最小. 题解: 这题其实就是要我们求任意两点的最短路,但是从点的个数上就知道这题不可以用floyd算法,其实多元最短路可以用dijkstra算.@.@!把所有的点的权值和点放到结构体里面,放入优先队列,其实这样就能保证每次拓展到的点就是这个点的最短路(因为是优先队列,保证拓展到的点这时候的值是最小的),其实就是这个点想通就很简单. 1 #inc

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

题目链接  Buy a Ticket 题意   给定一个无向图.对于每个$i$ $\in$ $[1, n]$, 求$min\left\{2d(i,j) + a_{j}\right\}$ 建立超级源点$n+1$, 对于每一条无向边$(x, y, z)$,$x$向$y$连一条长度为$2z$的边,反之亦然. 对于每个$a_{i}$, 从$i$到$n+1$连一条长度为$a_{i}$的边,反之亦然. 然后跑一边最短路即可. #include <bits/stdc++.h> using namespace

Codeforces 938D Buy a Ticket

Buy a Ticket 题意要求:求出每个城市看演出的最小费用, 注意的一点就是车票要来回的. 题解:dijkstra 生成优先队列的时候直接将在本地城市看演出的费用放入队列里, 然后直接跑就好了,  dis数组存的是, 当前情况下的最小花费是多少. 代码: 1 #include<iostream> 2 #include<cstring> 3 #include<string> 4 #include<queue> 5 #include<vector&g

Buy the Ticket DP +大数

Buy the Ticket 题目抽象:有m个手持50元的人,n个手持100元的人,售票处没有准备钱.问有多少种不同的方案使得购票不中断.每个人是不同的个体. 分析:简单DP题.画个格子,那么选取的点不越过对角线y = x.  dp[i][j]表示i个100元的人,j个手持50元的人的方案数.     i<=j dp[i][j] = dp[i-1][j]+dp[i][j-1];  i>j  dp[i][j] = 0;  如果对某些点有限制,那么在递推是加条件判断. ans = dp[n][m]

hdu Buy the Ticket

1 import java.math.BigInteger; 2 import java.util.*; 3 public class Main { 4 public static void main(String []args) 5 { 6 Scanner cin=new Scanner(System.in); 7 int n,m,i; 8 int t1=0; 9 while(cin.hasNextBigInteger()) 10 { 11 t1++; 12 m=cin.nextInt();

Buy the Ticket(卡特兰数+递推高精度)

Buy the Ticket Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 1886 Accepted Submission(s): 832   Problem Description The \\\\\\\"Harry Potter and the Goblet of Fire\\\\\\\" will be on show i

Buy the Ticket{HDU1133}

Buy the TicketTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 6517 Accepted Submission(s): 2720 Problem DescriptionThe "Harry Potter and the Goblet of Fire" will be on show in the next few day

HDU——1133 Buy the Ticket

Buy the Ticket Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 7152    Accepted Submission(s): 2998 Problem Description The "Harry Potter and the Goblet of Fire" will be on show in the nex

D. Buy a Ticket

D. Buy a Ticket Musicians of a popular band "Flayer" have announced that they are going to "make their exit" with a world tour. Of course, they will visit Berland as well. There are n cities in Berland. People can travel between cities