賽艇表演 51nod提高組模擬試題

2022-02-13 08:49:49 字數 2468 閱讀 5852

ac通道

題目描述

小明去某個地區**賽艇比賽,這個地區共有n個城市和m條道路,每個城市都有賽艇比賽,在第i個 城市**賽艇表演的價錢為ai, 去其他城市**也需要支付賽艇表演的**。任意兩個城市之間通過 一條公路連線,並且道路是雙向通行的, **賽艇比賽時經過的每一條道路都要支付一定的過路費, **完比賽返回家時經過的每一條道路也要支付過路費。 對於每個城市u,你需要為小明確定乙個城市v,使得從u出發,前往v看賽艇表演,再從v回到u,u可 以等於v,要求花費的總金額盡量的少。請根據題目給出的資料輸出總金額。

輸入格式

第一行兩個正整數n和m。 接下來m行,每行三個正整數u,v,w,表示有一條雙向道路連線u和v,且每經過一次的過路費是 w。 接下來一行n個數,第i個數表示在第i個城市**賽艇表演的價錢。

輸出格式

輸出一行n個數,第i個數表示從第i個城市出發至少要花多少錢

資料範圍

對於前30%的資料,n<=10,m<=20。 對於前50%的資料,n<=100,m<=500。 對於前70%的資料,n<=1500,m<=2000。 對於前85%的資料,圖的結構以某種方式隨機生成。 對於100%的資料,n<=2e5,m<=2e5,過路費和門票錢都在[1,1e12]內。

輸入樣例

4 2

1 2 4

2 3 7

6 20 1 25

輸出樣例

6 14 1 25

一道十分有趣的題。首先的思路肯定是對於每個城市,列舉終點,並求出其對應的最短路。

然而,毫無疑問,這樣的結果便是一片tle。

這道題最棘手的一點,便是每個點本身的price 和 路徑的w均會對結果造成影響。

而這也導致我們不能直接使用最短路演算法求出路徑w最小。

考慮一種方法,使得price和w可以同時被考慮。

而且原題已經明確的給出了我們一張圖,也要盡量利用這張圖。

想出一種建圖方法:

設立乙個超級源點s,將其和所有的點之間連邊,大小為price,然後從其跑最短路。最短路得到的dis即為每個點的答案。

而點與點之間的路徑,完全可以直接設為2w,不用真的跑來回。這樣,我們就直接考慮了price和w。

可以看一下對應操作: 對於下圖三號點,從s直接到3即為在原地**,從s -> 1 -> 3即為從3點去1點**。

(驚嘆,斜視,默坐,以為絕妙)

千少萬少,**不能少

#includeusing

namespace

std;

#define n 100010

#define ll long longinline ll read()

while

(isdigit(c))

return x *s;

}ll n, m;

struct

hehet[n];

ll f[n];

struct

node

};ll d[n];

bool

vis[n];

priority_queue

q;ll bian = 0

;inline

void

add(ll u, ll v, ll w)

void

dijstra(ll s));

d[s] = 0

;

while(!q.empty()));}}

}}return;}

intmain()

for(int i = 1;i <= n; i++)

dijstra(0);

for(int i = 1;i <= n; i++)

printf(

"%d

",d[i]);

return0;

}

戰略威懾 51nod提高組試題

ac通道 馬奧雷利亞諾布恩迪亞上校發動了他的第三十二次戰爭,讓我們祝他好運。馬孔多附近有n個城市,有n 1條雙向道路連通這些城市。上校想通過摧毀兩條公路的方式對當局予以威懾。但是上校的老師 告訴他為了戰略目的這兩條路不可以有共同的城市。這次行動對當局的威懾效果將等於兩條路徑的長 度的乘積。假設每條道...

51nod 螞蟻(模擬)

例如 竿子長10cm,3只螞蟻位置為2 6 7,最短需要4秒 左 右 右 最長需要8秒 右 右 右 input 第1行 2個整數n和l,n為螞蟻的數量,l為桿子的長度 1 l 10 9,1 n 50000 第2 n 1行 每行乙個整數a i 表示螞蟻的位置 0 a i l output 輸出2個數,...

51 nod 數數字(簡單模擬)

1770 數數字 基準時間限制 1 秒 空間限制 262144 kb 分值 20 難度 3級演算法題 統計一下 aa a aa a n個 a b 的結果裡面有多少個數字d,a,b,d均為一位數。樣例解釋 3333333333 3 9999999999,裡面有10個9。input 多組測試資料。第一行...