JLOI2015 管道連線

2022-05-11 12:17:24 字數 1988 閱讀 8210

小銘銘最近進入了某情報部門,該部門正在被如何建立安全的通道連線困擾。該部門有 n 個情報站,用 1 到 n 的整數編號。給出 m 對情報站 ui;vi 和費用 wi,表示情報站 ui 和 vi 之間可以花費 wi 單位資源建立通道。

如果乙個情報站經過若干個建立好的通道可以到達另外乙個情報站,那麼這兩個情報站就建立了通道連線。形式化地,若 ui 和 vi 建立了通道,那麼它們建立了通道連線;若 ui 和 vi 均與 ti 建立了通道連線,那麼 ui 和 vi 也建立了通道連線。

現在在所有的情報站中,有 p 個重要情報站,其中每個情報站有乙個特定的頻道。小銘銘面臨的問題是,需要花費最少的資源,使得任意相同頻道的情報站之間都建立通道連線。

輸入格式:

第一行包含三個整數 n;m;p,表示情報站的數量,可以建立的通道數量和重要情報站的數量。接下來 m 行,每行包含三個整數 ui;vi;wi,表示可以建立的通道。最後有 p 行,每行包含兩個整數 ci;di,表示重要情報站的頻道和情報站的編號。

輸出格式:

輸出一行乙個整數,表示任意相同頻道的情報站之間都建立通道連線所花費的最少資源總量。

輸入樣例#1:

5 8 4

1 2 3

1 3 2

1 5 1

2 4 2

2 5 1

3 4 3

3 5 1

4 5 1

1 11 2

2 32 4

輸出樣例#1:

4

選擇 (1; 5); (3; 5); (2; 5); (4; 5) 這 4 對情報站連線。

對於 100% 的資料,0 20000。

首先做一遍裸的斯坦納樹

f[i][sta]=min

因為題目可能出現斯坦納森林,所以還要進行一次子集dp

將每一種頻道作為二進位制為儲存,還要計算出ki[i]表示i頻道需要覆蓋的點(二進位制數)

列舉1<=sta<(1<

dp[sta]=min(f[j][k])    j=1~n

dp[sta]=min(dp[sta],dp[sub]+dp[sta-sub])

答案是dp[(1<

1 #include2 #include3 #include4 #include5 #include6

using

namespace

std;

7struct

node

8edge[60001

];11

int num,head[10001],f[1001][2001],dp[2001],ki[21

],n,m,p;

12bool vis[1001

];13

void add(int u,int v,int

dis)

1421

void bfs(int

s)22 44}

45}46}

47}48int

main()

49 56 memset(f,127/3,sizeof

(f));

57for (i=1;i<=p;i++)

5863

for (i=1;i<(1

<)

6471

bfs(i);72}

73 memset(dp,127/2,sizeof

(dp));

74for (i=1;i<(1

<)

75

85 cout<1

<1

];86 }

JLOI2015 管道連線

題意 給定一張n個點m條邊的無向圖,有p個關鍵點,分成了c類。連通每條邊有乙個代價 w i 求最小代價使得同一類的關鍵點都聯通。n leq 1000,p leq 10 題解 如果直接跑斯坦納樹會強行把所有關鍵點聯通,但實際上兩類關鍵點不一定非要聯通。相當於我們求了一棵斯坦納樹,但要求的是斯坦納森林。...

JLOI2015 通道連線

輸入1 5 8 4 1 2 3 1 3 2 1 5 1 2 4 2 2 5 1 3 4 3 3 5 1 4 5 1 1 1 1 2 2 3 2 4 輸入2 5 8 4 1 2 2 1 3 2 1 5 1 2 4 2 2 5 2 3 4 2 3 5 1 4 5 1 1 1 1 2 2 3 2 4sam...

JLOI2015 裝備購買

有n件裝備 每個裝備有m個引數和乙個 如果某個裝備能夠被已經買過的裝備組合出來 即 b1zi1 bpzip zh b 是實數 那麼就不需要買這件裝備 求最多的買裝備數和最少的錢 大佬 線性基裸題 我 不會啊 線性相關 一組資料中有乙個或者多個量可以被其餘量表示。所以題面顯然就是線性相關的定義,直接上...