傳送門:
思路:
一眼看上去很像斯坦納樹
但是限制稍有不同,只要每種顏色的點聯通即可
也就是說最後可能是森林
我聽說裸寫斯坦納樹有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 單位資源建立通道。如...