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