題意:有n員工和乙個老闆,老闆要把乙個訊息傳給給定的m個員工,老闆要把訊息傳給這給定的m個員工各有乙個花費,n個員工也可以互相傳遞訊息,都有各自的花費,問老闆把這個訊息傳遞給這m個員工的最小花費(不管其他的員工知道不知道)。
思路:斯坦納樹模板題。
現在有乙個0節點,可以與m個節點相連,且給出了權值,
求0和這m個節點組成的最小斯坦納樹。
令s表示m個節點的子集,
dp[s][i]表示包含s中節點且以i為根的樹的最小權值
dp[s][i]=min(dp[s1][i]+dp[s2][i],dp[s][j]+g[i][j]),
其中s1+s2=s,
#include
#include
#include
using
namespace
std;
#define n 60
int g[n][n],a[n],dp[(1
<<10)+10][n];
int n,m;
const
int inf=0x3f3f3f3f;
int main()
for(int k=0;k<=n;++k)
for(int i=0;i<=n;++i)
for(int j=0;j<=n;++j)
g[i][j]=min(g[i][j],g[i][k]+g[k][j]);
memset(dp,0x3f,sizeof(dp));
for(int i=1;i<=m;++i)
for(int j=0;j<=n;++j)
dp[1
<1][j]=g[a[i]][j];
for(int s=1;s<(1
for(int i=0;i<=n;++i)
for(int ss=s;ss;ss=(ss-1)&s)
dp[s][i]=min(dp[s][i],dp[ss][i]+dp[s-ss][i]);
for(int i=0;i<=n;++i)
for(int j=0;j<=n;++j)
dp[s][i]=min(dp[s][i],dp[s][j]+g[i][j]);
}printf("%d\n",dp[(1
<1][0]);
}return
0;}
模板 斯坦納樹
include int main 斯坦納樹 time limit 1 sec memory limit 128 mb description 現在有乙個n m的矩陣,某些元素為0,剩下的元素大於0.現在你要選擇一些元素,使得任意兩個為0的元素都能夠通過選中的元素四連通.注意,若想達到要求,所有的0自...
模板 斯坦納樹
又是圖論裡的乙個可怕的資料結構。斯坦納樹的定義 給定個無向圖和圖上的一些點組成的點集,那麼能使這些點集連通的該圖的子樹就是該圖對於該點集的一顆斯坦納樹。那麼最小斯坦納樹就是所有斯坦納樹中邊權值和最小的一顆。其實就是最小生成樹問題的乙個衍伸,當這個點集包含圖中所有的點的時候那麼問題便轉換為最小生成樹。...
斯坦納樹模板
出自lxw部落格 給出n個點,然後給出m條雙向邊,邊有邊權。再給出乙個大小為k的點集,求使得點集聯通的最小花費。時間複雜度o n 3 k ce 2 k 其中c為spfa常數。include define rep i,a,b for int i a i b i using namespace std ...