道路重建 2018山東冬令營

2022-07-02 02:45:09 字數 1486 閱讀 8997

時間限制: 1 sec  記憶體限制: 128 mb

提交: 67  解決: 24

[提交][狀態][討論版]

小l的家鄉最近遭遇了一場洪水,城市變得面目全非,道路也都被沖毀了。生活還要繼續,於是市**決定重建城市中的道路。

在洪水到來前,城市中共有n個區域和m條連線這些區域的雙向道路,

道路連通了所有的區域,為了方便人們的出行,只能重建這些原有的道路, 不能建新的道路。編號為s的區域是市政廣場,市**希望重建的道路能夠

使得所有區域到市政廣場的最短路與受災前保持不變,同時為了節約救災 經費,還要使得修建的所有道路的長度和盡可能小。

小l為了拯救心愛的家鄉,決定站出來,成為優秀的青年理論計算機科 學家,於是馬上投入到了對這個問題的研究中。你能幫幫小l嗎?

第一行兩個整數n和m,表示區域與道路的個數。

接下來m行,每行三個正整數u,v和w,描述一條連線u和v、長為w的道路。

最後一行,乙個正整數s,表示市政廣場的編號。

輸出乙個整數,表示最小長度和。

5 7

1 2 1

2 3 4

2 4 2

4 3 2

5 2 2

4 5 1

5 1 1

2

6

最優方案是重建1-2,1-5,2-4,4-3的道路,此時所有區域到達區域2的最短路分別是1, 0, 4, 2, 2,道路長度和是1 + 1 + 2 + 2 = 6。

對於20%的資料,n ≤ 10, m ≤ 20;

對於另外30%的資料,邊權不超過2;

對於100%的資料,1 ≤ n ≤ 105, n − 1 ≤ m ≤ 2 ∗ 105, 1 ≤ w ≤ 109。

**如下:

#include#include

#include

#include

#include

#define ll long long

using

namespace

std;

const

int inf=1e9+7;

const

int maxn=1e6+5

;struct

edgeedge[maxn];

inthead[maxn],vis[maxn],pre[maxn],cnt,n,m;

ll dis[maxn];

void add(int u,int v,intw)

void spfa(int

s)

else

}dis[v]=dis[u]+w;

if(!vis[v])}}

}printf(

"%lld\n

",ans);}

intmain()

scanf("%d

",&st);

spfa(st);

return0;

}

2018 山東冬令營 中國石油 劃分

時間限制 1 sec 記憶體限制 128 mb 提交 18 解決 6 提交 狀態 討論版 給出n個不超過m的非負整數,將數劃分成兩個集合,記為1號集合和2號集合。x1為1號集合中所有數的異或和,x2為2號集合中所有數的異或和。在最大化x1 x2的前提下,最小化x1。第一行n 第二行n個非負整數 一行...

位元組跳動冬令營2018

給定一棵有根樹,邊有邊權,兩個人輪流操作,每次可以把一條邊的權值減少一,權值變為 0 表示把子樹砍掉,問先手第一輪操作哪些邊使得自己必勝。n 1 06 n leq 10 6 n 10 6之前的部落格,發現這道題本質上是圖的刪邊遊戲。把環縮掉,就變成了樹上刪邊遊戲了。結論是 葉子的 sg 為 0,非葉...

2018北京冬令營測試

題面戳我!我們發現 所有數加起來等於線索上的權值 這個東西可以用流量平衡來解決,所以可以跑上下界費用流。建圖就是,把上下線索放左邊,左右線索放右邊,源點向所有上下線索連乙個上下界均為對應權值的邊,同理左右線索向匯點連乙個上下界均為對應權值的邊 對於空格就是把左邊的乙個節點和右邊的乙個節點連起來,上下...