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 Ticket(SPFA)
題意: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 Ticket 【spfa優化】
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. Bicolorings(dp)
https://codeforces.com/contest/1051/problem/D 題意 一個2*n的矩陣,你可以用黑白格子去填充他,求聯通塊數目等於k的方案數,答案%998244353. 思路 按列dp,定義狀態dp[i][j][k]為前i列,有j個聯通塊,最後一列為k的方案