藍橋學習 PREV 25

2021-10-08 17:15:37 字數 1656 閱讀 7752

試題 歷屆試題

prev-25 城市建設

問題描述

棟棟居住在乙個繁華的c市中,然而,這個城市的道路大都年久失修。市長準備重新修一些路以方便市民,於是找到了棟棟,希望棟棟能幫助他。c市中有n個比較重要的地點,市長希望這些地點重點被考慮。現在可以修一些道路來連線其中的一些地點,每條道路可以連線其中的兩個地點。另外由於c市有一條河從中穿過,也可以在其中的一些地點建設碼頭,所有建了碼頭的地點可以通過河道連線。

棟棟拿到了允許建設的道路的資訊,包括每條可以建設的道路的花費,以及哪些地點可以建設碼頭和建設碼頭的花費。市長希望棟棟給出乙個方案,使得任意兩個地點能只通過新修的路或者河道互達,同時花費盡量小。

輸入格式

輸入的第一行包含兩個整數n, m,分別表示c市中重要地點的個數和可以建設的道路條數。所有地點從1到n依次編號。

接下來m行,每行三個整數a, b, c,表示可以建設一條從地點a到地點b的道路,花費為c。若c為正,表示建設是花錢的,如果c為負,則表示建設了道路後還可以賺錢(比如建設收費道路)。

接下來一行,包含n個整數w_1, w_2, …, w_n。如果w_i為正數,則表示在地點i建設碼頭的花費,如果w_i為-1,則表示地點i無法建設碼頭。

輸入保證至少存在乙個方法使得任意兩個地點能只通過新修的路或者河道互達。

輸出格式

輸出一行,包含乙個整數,表示使得所有地點通過新修道路或者碼頭連線的最小花費。如果滿足條件的情況下還能賺錢,那麼你應該輸出乙個負數。

樣例輸入

5 51 2 4

1 3 -1

2 3 3

2 4 5

4 5 10

-1 10 10 1 1

樣例輸出

思路:

一道有點變形的最小生成樹的題目,用到了最小生成樹和並查集,首先我們先要判斷一下題目給出的狀態,雖然題目說明了給出的資料都有效,但是我們得先判斷一下如果使用道路的時候的總值,因為如果直接做了碼頭的判斷,可能因為只有乙個合格碼頭而導致無法與其他道路正常連線,徒加工程費用。所以我們得先算出只鋪設道路時的值,然後對比兩個都建設的值,當然要注意的還有道路如果無法全部連線所有的城市,那其將無法使用,因為沒有意義。

所有的港口為了能正常的連通,都得當成從0點出發到達該點的路線,只有經過這樣的轉換才可以正常的去計算。還有就是如果是消費為負的路就一定要加進來,因為是只賺不賠啊。

**:

#include#includeusing namespace std;

struct diand[110100];

int cuan[10100],dp[10100],cnt=0;

bool cmp(dian q,dian p)

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

int num1=****(n,m);

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

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

} int num2=****(n,m+n);

if(flag!=1)cout

}

藍橋學習 PREV 24

試題 歷屆試題 prev 24 郵局 問題描述 c村住著n戶村民,由於交通閉塞,c村的村民只能通過信件與外界交流。為了方便村民們發信,c村打算在c村建設k個郵局,這樣每戶村民可以去離自己家最近的郵局發信。現在給出了m個備選的郵局,請從中選出k個來,使得村民到自己家最近的郵局的距離和最小。其中兩點之間...

藍橋學習 PREV 27

試題 歷屆試題 prev 27 螞蟻感冒 問題描述 長100厘公尺的細長直桿子上有n只螞蟻。它們的頭有的朝左,有的朝右。每只螞蟻都只能沿著桿子向前爬,速度是1厘公尺 秒。當兩隻螞蟻碰面時,它們會同時掉頭往相反的方向爬行。這些螞蟻中,有1只螞蟻感冒了。並且在和其它螞蟻碰面時,會把感冒傳染給碰到的螞蟻。...

藍橋 PREV 6 翻硬幣

歷屆試題 翻硬幣 問題描述 小明正在玩乙個 翻硬幣 的遊戲。桌上放著排成一排的若干硬幣。我們用 表示正面,用 o 表示反面 是小寫字母,不是零 比如,可能情形是 oo oooo 如果同時翻轉左邊的兩個硬幣,則變為 oooo oooo 現在小明的問題是 如果已知了初始狀態和要達到的目標狀態,每次只能同...