bzoj4006 JLOI2015 管道連線

2021-07-29 10:57:37 字數 1395 閱讀 1713

小銘銘最近進入了某情報部門,該部門正在被如何建立安全的通道連線困擾。

該部門有 n 個情報站,用 1 到 n 的整數編號。給出 m 對情報站 ui;vi 和費用 wi,表示情

報站 ui 和 vi 之間可以花費 wi 單位資源建立通道。

如果乙個情報站經過若干個建立好的通道可以到達另外乙個情報站,那麼這兩個情報站就

建立了通道連線。形式化地,若 ui 和 vi 建立了通道,那麼它們建立了通道連線;若 ui 和 vi 均

與 ti 建立了通道連線,那麼 ui 和 vi 也建立了通道連線。

現在在所有的情報站中,有 p 個重要情報站,其中每個情報站有乙個特定的頻道。小銘銘

面臨的問題是,需要花費最少的資源,使得任意相同頻道的情報站之間都建立通道連線。

n≤1000 m≤3000 p≤10

最終目標是使同一組的特殊點位於乙個聯通塊裡。由於特殊點很少,可以考慮用斯坦納樹來做。

首先是斯坦納樹的一搬討論,設狀態f[i][s],然後子集dp+spfa。

然而不同組的特殊點不一定在乙個聯通塊裡,所以預處理f陣列後,還要另乙個子集dp來合併答案。設g[s],狀態s中為1的所有聯通塊都已合併。

#include 

#include

#include

using namespace std;

const int n=1005,m=6005,s=1025,inf=1e8;

typedef long long ll;

int n,m,tot,d,h[n],e[m],nxt[m],w[m],ans,d[n],f[n][s],g[s],s,st[n],id[n],belong[n];

bool v[n];

char c;

intread()

void add(int

x,int

y,int z)

void init(int

x,int

y) init(x,y+1); if (st[y]>0) init(x|st[y],y+1);

}int main()

memset(f,42,sizeof(f));

s=1<0;

}for (int st=1;st}

memset(v,0,sizeof(v));

for (int i=1;i<=n;i++) if (f[i][st]1; d[tot=(tot+1)%n]=i;

}for (int i=0;i!=tot;)

}v[x]=0;}}

memset(g,42,sizeof(g));

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

printf("%d\n",g[s-1]);

return

0;}

bzoj4006 JLOI2015 管道連線

傳送門 思路 一眼看上去很像斯坦納樹 但是限制稍有不同,只要每種顏色的點聯通即可 也就是說最後可能是森林 我聽說裸寫斯坦納樹有90 所以我們要在外面再套一層dp f i j 還是斯坦納樹的狀態,i是以i為根,j是狀態為j 先用斯坦納樹求出每種聯通狀況的最小費用 再設dp i 表示i這個狀態的最小費用...

bzoj 4006 JLOI2015 管道連線

time limit 30 sec memory limit 128 mb submit 1062 solved 576 submit status discuss 小銘銘最近進入了某情報部門,該部門正在被如何建立安全的通道連線困擾。該部門有 n 個情報站,用 1 到 n 的整數編號。給出 m 對情...

BZOJ 4006 JLOI2015 管道連線

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