1. 程式人生 > >Educational Codeforces Round 38-D- Buy a Ticket(SPFA)

Educational Codeforces Round 38-D- Buy a Ticket(SPFA)


題意:n個城市,每個城市由一個人,每個人都想看一場演唱會,並且n個城市都將舉辦演唱會,但是每個城市演唱會的門票價格不同,一個人可以在自己城市看也可以去能到達的城市看,若第i個城市的人去第j個城市(假設能到達)看的話,會花費dis(i,j)*2+aj的花費,其中aj表示j城市演唱會的門票價格。現在有m條邊描述了若干個城市的聯通情況,問你每個人看演唱會花費的最小代價分別為多少?

題解:我們將n個城市分別和原點建邊,建立原點為n+1,建邊的權值為ai,將原點放進佇列,跑spfa,最後更新出的dis陣列就是答案。

#include<queue>
#include<vector>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define ll long long 
#define maxn 200005
#define inf ((1ll<<60-1))
int n,m,x,y,vis[maxn];
ll z,ans[maxn],dis[maxn];
priority_queue<pair<ll,int> > t;
vector<pair<int,ll> >q[maxn];
void work(int len,int st)
{
	for(int i=1;i<len;i++)
		dis[i]=inf;
	t.push(make_pair(dis[st]=0,st));
	while(t.empty()==0)
	{
		int now=t.top().second;
		t.pop();vis[now]=0;
		for(int i=0;i<q[now].size();i++)
		{
			int v=q[now][i].first;
			ll c=q[now][i].second;
			if(dis[v]>dis[now]+c)
			{
				dis[v]=dis[now]+c;
				if(!vis[v])
					vis[v]=1,t.push(make_pair(-dis[v],v));
			}
		}
	}
}
int main(void)
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d%lld",&x,&y,&z);
		q[x].push_back(make_pair(y,2ll*z));
		q[y].push_back(make_pair(x,2ll*z));
	}
	for(int i=1;i<=n;i++)
	{
		scanf("%lld",&z);
		q[n+1].push_back(make_pair(i,z));
	}
	work(n+1,n+1);
	for(int i=1;i<=n;i++)
		printf("%lld ",dis[i]);
	printf("\n");
	return 0;
}

相關推薦

Educational Codeforces Round 38-D- Buy a TicketSPFA

題意:n個城市,每個城市由一個人,每個人都想看一場演唱會,並且n個城市都將舉辦演唱會,但是每個城市演唱會的門票價格不同,一個人可以在自己城市看也可以去能到達的城市看,若第i個城市的人去第j個城市(假設能到達)看的話,會花費dis(i,j)*2+aj的花費,其中aj表示j城市演

Educational Codeforces Round 26-E-Vasya's Function思維

題意:見體面,就是求f(x,y)題解:假如我們模擬遞推肯定炸,因為x和y有1e12這麼大,因此我們要看看這裡邊是否存在著無用功,首先因為每次b都會減掉一個gcd(a,b),我們可以將a和b分別寫成x1*

Educational Codeforces Round 38 (Rated for Div. 2) ----D

pan inf force mes hid get struct include push D. Buy a Ticket 問題轉換為對於每一個點x,求出一個點y,使得xy的最短路2倍+在y舉辦的費用最小。 考慮建一個超級源點,向每一個點連一條費用為其舉辦所需費用

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

code 簡單 max back tin 不可 bsp for i++ 題目鏈接:Buy a Ticket 題意:   給出n個點m條邊,每個點每條邊都有各自的權值,對於每個點i,求一個任意j,使得2×d[i][j] + a[j]最小。 題解:   這題其實就是要我們求任意

Educational Codeforces Round 46 D. Yet Another Problem On a Subsequence

mod ons ++ 數列 一個數 () -- problem dot 題目大意 定義一個數列是“好的”:第一個數字a[0]為數列長度+1。 定義一個數列的子序列是“好的”:這個子序列能分割成幾個“好的”數列。 各一個數列,求“好的”子序列的數目。 解題思路 一開始想

codeforces 938d D. Buy a Ticket

題意: n個點 m 個邊,並且每個點有個權值,你要對每個點求出 一個點j  使得dis[i,j]*2+a[j]  是最小的。 思路: 建立一個超級源點 S 從S 向每個點建一條邊 邊權為該點的點權,然後跑個dij 就是答案。 不難理解。 程式碼: #include&

Educational Codeforces Round 21 D. Array Division

nbsp 題目 位置 pac 個數 ret vision n) scanf 題目鏈接:Educational Codeforces Round 21 D. Array Division 題意: 給你n個數,現在你可以改變1<=個數的位置,然後問你是否存在有一個k,使得

Educational Codeforces Round 24 CF 818 A-G 補題

red sync codeforce ner pro 有趣的 scanf 決心 Education 6月快要結束了 期末也過去大半了 馬上就是大三狗了 取消了小學期後20周的學期真心長, 看著各種北方的學校都放假嗨皮了,我們這個在北回歸線的學校,還在忍受酷暑。 過年的時候下

Educational Codeforces Round 24 D

put 數字出現次數 side != during read any colors appear Alice and Bob got very bored during a long car trip so they decided to play a game. Fro

Educational Codeforces Round 30 D. Merge Sort

全部 不用 () ace str ron cout == -s 題意:給你n和k,n代表有多少個數,k代表幾次操作,求一個1到n的序列,要k次mergesort操作才能還原 Examples Input 3 3 Output 2 1 3 Input 4 1

Educational Codeforces Round 36 D】 Almost Acyclic Graph

pac cati href cor com def eve pan test 【鏈接】 我是鏈接,點我呀:) 【題意】 在這裏輸入題意 【題解】 找到任意一個環。 然後枚舉刪掉其中的某一條邊即可。 (因為肯定要刪掉這個環的,那麽方法自然就是刪掉其中的某一條邊

Codeforces 938D Buy a Ticketspfa優化】

ack iostream down logs spa == ace const struct 用到了網絡流的思想(大概)。新建一個源點s,所有邊權擴大兩倍,然後所有的點向s連邊權為點權的無向邊,然後以s為起點跑spfa(S什麽L優化的),這樣每個點到s的距離就是答案。 原因

Educational Codeforces Round 38 (Rated for Div. 2) ----C

none struct 12px 存在 lose tar u+ bit http C. Constructing Tests 經過簡單的分析之後,我們可以發現,對於x,我們要求的就是一組n,m滿足n^2-(n/m)^2=x。 有兩種求法。 第一種: 觀察n的極

Codeforces 938D Buy a Ticket 轉化建圖 + 最短路

typedef ++ using fine return push 題意 aps stat 題目鏈接 Buy a Ticket 題意 給定一個無向圖。對於每個$i$ $\in$ $[1, n]$, 求$min\left\{2d(i,j) + a_{j}\right\

cf- Educational Codeforces Round 40 -D

efi code 短路徑 emp brush log urn end cpp 題意:給你n個點,m條邊,一個起點s,一個終點t的無向圖,問在某兩個點之間加一條邊,不改變s到t的最短路徑的值的加法有多少種,所有點一定連接; 思路:首先,默認相鄰兩點的權值都為1,會改變值的情況

Educational Codeforces Round 42 D. Merge Equals (set + pll)

equal ati urn int merge 大根堆 pro begin tdi CF962D 題意:    給定一個數列,對於靠近左端的兩個相同大小的值x可以合並成一個點。把x 乘以2 放在第二個點的位置,問最後的數列大小和每個位子的值。 思路:   利用set

Educational Codeforces Round 16 D. Two Arithmetic Progressions

解線性同餘方程組,且方程僅2個,另外得到的x限制在L,R區間內, 觀察一下A1K-A2L=B2-B1,便可知,通解(K,L)中會同時增大或同時減小,大可以先使得K,L大於等於0,於是之後只需要考慮讓K不斷增大且這樣得到的x在[L,R]內即可。 由x在[L,R]中,便可以求出K的範圍,然後分情況討論一下就好

Educational Codeforces Round 54 D - Edge Deletion 圖+貪心+dijkstra

題意: 給定n個點,m條邊的無向連通圖,定義d[j]為1號結點到j結點的最短距離 讓你刪去一些邊,讓邊數剩餘最多為k條,如果刪邊前後的兩個圖中d[j]相同的話,那j結點就是good點, 給定的邊編號1~m,現在讓你給出一種刪邊方案,是的good點儘量多; 思路: 單原點最短路

Educational Codeforces Round 54 D Edge Deletion最短路樹

題目連結:Edge Deletion 題意:給定一張n個頂點,m條邊的帶權無向圖,已知從頂點1到各個頂點的最短路徑為di,現要求保留最多k條邊,使得從頂點1到各個頂點的最短距離為di的頂點最多。輸出m條邊中需要保留的邊的編號。 題解:先跑一遍最短路,在鬆弛操作時,存父子關係和邊,在以這些關係建立新圖(樹)

Educational Codeforces Round 51 D. Bicoloringsdp

https://codeforces.com/contest/1051/problem/D 題意 一個2*n的矩陣,你可以用黑白格子去填充他,求聯通塊數目等於k的方案數,答案%998244353. 思路 按列dp,定義狀態dp[i][j][k]為前i列,有j個聯通塊,最後一列為k的方案