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

题目链接:Buy a Ticket

题意:

  给出n个点m条边,每个点每条边都有各自的权值,对于每个点i,求一个任意j,使得2×d[i][j] + a[j]最小。

题解:

  这题其实就是要我们求任意两点的最短路,但是从点的个数上就知道这题不可以用floyd算法,其实多元最短路可以用dijkstra算。@。@!把所有的点的权值和点放到结构体里面,放入优先队列,其实这样就能保证每次拓展到的点就是这个点的最短路(因为是优先队列,保证拓展到的点这时候的值是最小的),其实就是这个点想通就很简单。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef pair<long long,long long> P;
 4 const int MAX_N = 2e5+9;
 5 vector<P> vec[MAX_N];
 6 long long vis[MAX_N],val[MAX_N];
 7 priority_queue< P , vector<P> , greater<P> > que;
 8 int N,M,x;
 9 void init()
10 {
11     for(int i=0;i<MAX_N;i++) vec[i].clear();
12     while(!que.empty()) que.pop();
13     memset(vis,0,sizeof(vis));
14     memset(val,0,sizeof(val));
15 }
16 int main()
17 {
18     cin>>N>>M;
19     init();
20     for(int i=0;i<M;i++)
21     {
22         long long a,b,c;
23         scanf("%lld%lld%lld",&a,&b,&c);
24         vec[a].push_back(P(b,2*c));
25         vec[b].push_back(P(a,2*c));
26     }
27     for(int i=1;i<=N;i++)
28     {
29         long long t;
30         scanf("%lld",&t);
31         que.push(P(t,i));
32     }
33
34     while(!que.empty())
35     {
36         P p = que.top();que.pop();
37         if(vis[p.second]) continue;
38         vis[p.second] = 1;
39         val[p.second] = p.first;
40         for(int i=0;i<vec[p.second].size();i++)
41         {
42             que.push(P(p.first+vec[p.second][i].second , vec[p.second][i].first));
43         }
44     }
45
46     for(int i=1;i<=N;i++) printf("%lld ",val[i]);
47     cout<<endl;
48     return 0;
49 }

原文地址:https://www.cnblogs.com/doggod/p/8496058.html

时间: 2024-10-01 17:18:07

Codeforces 938 D. Buy a Ticket (dijkstra 求多元最短路)的相关文章

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 tou

CF938D Buy a Ticket dijkstra

考试T1,建一个反图跑一个最短路就好了~ code: #include <bits/stdc++.h> #define ll long long #define N 200002 #define M 600009 #define setIO(s) freopen(s".in","r",stdin) , freopen(s".out","w",stdout) using namespace std; int n,m,

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

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

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

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

Dijkstra求含权图最短通路;试探与回溯保证枚举的不遗漏不重复;国际象棋八皇后问题

求两节点的最短通路,对于无权图,可以通过图的广度优先遍历求解.含权图一般通过Dijkstra算法求解. import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; public class Shortest { static class Cell{ int node;//连接到哪个节点 int weight