BZOJ 4006 JLOI2015 管道連線

2022-04-30 05:42:06 字數 1398 閱讀 4427

bzoj_4006_[jloi2015]管道連線_斯坦納樹

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

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

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

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

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

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

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

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

分析:先求一遍原圖的斯坦納樹,處理出每個連通狀態下的最小花費

但我們發現所求的方案並不一定是所有關鍵點都連通

再處理出每個頻道需要情報站的狀態

要進行狀態之間的合併

dp g[i] = min(g[i], g[j] + g[i^j])

思路同bzoj_4774

**:

#include #include #include using namespace std;

#define n 1050

#define m 6050

int head[n],to[m],nxt[m],val[m],n,m,p,cnt,inq[n];

int dis[1025][n],q[n],l,r,d[11],s[11];

int f[1025],g[1025],mask,tnl,is[11];

inline void add(int u,int v,int w)

struct ab[11];

bool cmp1(const a &x,const a &y)}}

}}

}int main()

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

sort(b+1,b+p+1,cmp1);

b[0].rnum=-10000;

for(i=1;i<=p;i++)else b[i].num= ++tnl;

}sort(b+1,b+p+1,cmp2);

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

stan();

memset(f,0x3f,sizeof(f));

memset(g,0x3f,sizeof(g));

for(i=0;i<=mask;i++)

}for(i=0;i<=mask;i++)

}g[i]=f[k];

}for(i=0;i<=mask;i++)

}printf("%d\n",g[mask]);

}

bzoj4006 JLOI2015 管道連線

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