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,edges,s,t;
ll val[M], d[N];
int hd[N],to[M],nex[M],done[N];
struct Node
{
    int u;
	ll dis;
    Node(int u=0,ll dis=0):u(u),dis(dis){}
    bool operator<(Node b) const { return b.dis<dis; }
};
priority_queue<Node>q;
void addedge(int u,int v,ll c)
{
	nex[++edges]=hd[u],hd[u]=edges,to[edges]=v,val[edges]=c;
}
void dijkstra()
{
	memset(d,0x3f,sizeof(d));
	d[s]=0ll;
	q.push(Node(s,0ll));
	while(!q.empty())
	{
		Node e=q.top(); q.pop();
		int u=e.u;
		if(done[u]) continue;
		done[u]=1;
		for(int i=hd[u];i;i=nex[i])
		{
			int v=to[i];
			if(d[u]+val[i]<d[v])
			{
				d[v]=d[u]+val[i];
				q.push(Node(v, d[v]));
			}
		}
	}
}
int main()
{
	// setIO("movie");
	int i,j;
	scanf("%d%d",&n,&m);
	for(i=1;i<=m;++i)
	{
		int u,v;
		ll c;
		scanf("%d%d%lld",&u,&v,&c);
		if(u==v) continue;
		addedge(u,v,1ll*2*c), addedge(v,u,1ll*2*c);
	}
	s=0;
	for(i=1;i<=n;++i)
	{
		ll w;
		scanf("%lld",&w),addedge(s,i,1ll*w);
	}
	dijkstra();
	for(i=1;i<=n;++i) printf("%lld ",d[i]);
	return 0;
}

  

原文地址:https://www.cnblogs.com/guangheli/p/11671151.html

时间: 2024-10-18 23:47:41

CF938D Buy a Ticket dijkstra的相关文章

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

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

CF938D Buy a Ticket

4 2 1 2 4 2 3 7 6 20 1 25 6 14 1 25 3 3 1 2 1 2 3 1 1 3 1 30 10 20 12 10 12 思路: 建立虚点把点券转化成边权 #include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> #include <queue> #define int long long #define maxn

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 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

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