bzoj4006 JLOI2015 管道連線

2021-07-11 16:38:27 字數 1145 閱讀 5450

傳送門:

思路:

一眼看上去很像斯坦納樹

但是限制稍有不同,只要每種顏色的點聯通即可

也就是說最後可能是森林

我聽說裸寫斯坦納樹有90

所以我們要在外面再套一層dp

f[i][j]還是斯坦納樹的狀態,i是以i為根,j是狀態為j

先用斯坦納樹求出每種聯通狀況的最小費用

再設dp[i]表示i這個狀態的最小費用

列舉子集時保證顏色相同的連通性相同,轉移即可

dp[i]=min(dp[j]+dp[i-j])j是i的子集

#include#include#include#includeconst int maxn=11,maxk=11,maxq=105;

const int dx=,dy=;

using namespace std;

int n,m,k,head,tail,cnt,pw[maxk+5],w[maxk],q[maxq+10],f[maxn][maxn][1<=0&&x=0&&ymaxq) head=1;

int sta=q[head],x,y;

decode(sta,x,y);

//printf("x=%d y=%d\n",x,y);

for (int i=0;i<4;i++)}}

bo[x][y]=0;

}} void dfs(int i,int s)

void work()

if (f[i][j][sta]!=inf) q[++tail]=id(i,j),bo[i][j]=1;//printf("x=%d y=%d sta=%d f=%d\n",i,j,sta,f[i][j][sta]);

}spfa(sta);

}int x,y;

decode(w[0],x,y);

//printf("xx=%d yy=%d sta=%d\n",x,y,pw[k]-1);

printf("%d\n",f[x][y][pw[k]-1]);

int nx,ny,ns;

decode2(pre[x][y][pw[k]-1],nx,ny,ns);

//printf("nx=%d ny=%d ns=%d\n",nx,ny,ns);

dfs(w[0],pw[k]-1);

for (int i=0;i

bzoj4006 JLOI2015 管道連線

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

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 單位資源建立通道。如...