JLOI2015 管道連線

2022-05-19 02:42:40 字數 1396 閱讀 3030

題意:

給定一張n個點m條邊的無向圖,有p個關鍵點,分成了c類。

連通每條邊有乙個代價$w_i$,求最小代價使得同一類的關鍵點都聯通。

$n\leq 1000,p\leq 10$。

題解:如果直接跑斯坦納樹會強行把所有關鍵點聯通,但實際上兩類關鍵點不一定非要聯通。

相當於我們求了一棵斯坦納樹,但要求的是斯坦納森林。

考慮森林中的每棵樹,容易發現它們必須是若干類關鍵點集的並。

換句話說,設一棵樹的連通狀態為s,對於第i類的關鍵點集$t_i$,要麼$t_i \subseteq s$,要麼$t_i \cap s=\emptyset$。

(我一開始只判斷了前半部分居然拿到了85分,資料屬實np)

於是將所有滿足要求的狀態s拿出來重新dp即可。

複雜度$o(n\times 3^p )$。

套路:**:

#include#define maxn 1005

#define maxm 10005

#define inf 0x7fffffff

#define ll long long

#define rint register int

#define debug(x) cerr<

namespace

std;

inthd[maxn],to[maxm],nxt[maxm],cst[maxm];

int n,m,p,dp[maxn][1

<<10

],inq[maxn],cnt;

int sta[1

<<10],res[maxn]; queueq;

inline

intread()

inline

void addedge(int u,int v,int

w)inline

void spfa(int

s) }

}}int

main()

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

for(int j=0;j

memset(sta,

63,sizeof

(sta));

for(int j=1;j

if(!flag) continue

;

for(int i=1;i<=n;i++) sta[j]=min(sta[j],dp[i][j]);

}for(int i=0;i

for(int j=0;j

sta[i|j]=min(sta[i|j],sta[i]+sta[j]);

printf(

"%d\n

",sta[(1

<1

]);

return0;

}

管道連線

JLOI2015 管道連線

小銘銘最近進入了某情報部門,該部門正在被如何建立安全的通道連線困擾。該部門有 n 個情報站,用 1 到 n 的整數編號。給出 m 對情報站 ui vi 和費用 wi,表示情報站 ui 和 vi 之間可以花費 wi 單位資源建立通道。如果乙個情報站經過若干個建立好的通道可以到達另外乙個情報站,那麼這兩...

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 是實數 那麼就不需要買這件裝備 求最多的買裝備數和最少的錢 大佬 線性基裸題 我 不會啊 線性相關 一組資料中有乙個或者多個量可以被其餘量表示。所以題面顯然就是線性相關的定義,直接上...