#include
int main()
斯坦納樹
time limit: 1 sec memory limit: 128 mb
description
現在有乙個n*m的矩陣,某些元素為0,剩下的元素大於0.
現在你要選擇一些元素,使得任意兩個為0的元素都能夠通過選中的元素四連通.
(注意,若想達到要求,所有的0自身必須被選中.)
那麼請問選中元素的和的最小值是多少?
input
第一行兩個整數n,m,表示矩陣的長和寬.
接下來n行,每行m個整數,第i行第j個整數a[i,j]表示矩陣中第i行第j列的元素大小.
output
輸出一行乙個整數表示選中元素的最小和.
sample input
4 4
0 1 1 0
1 9 9 1
1 9 9 1
0 1 1 0
sample output
6hint
1<=n,m<=10,2<=num(0)<=10,0<=a[i,j]<=2^16.
斯坦納樹模板
流程:列舉狀態集s
將 f[
s][x
]f 的x入隊
spfa(s)
}
#include
#include
#include
#include
#include
#define n 105
#define p 12
#define inf 0x3f3f3f3f
using
namespace
std;
const
int dx=;
const
int dy=;
struct eli
e[n<<2];
int head[n],cnt;
inline
void add(int u,int v)
int n,m;
int id[p][p],val[n];
void build()
int f[1
q;bool in[n];
void spfa(int s)}}
}void work()
int ans=inf;
for(i=1;i<=n;i++)ans=min(ans,f[(1
<1][i]);
printf("%d\n",ans);
}int main()
模板 斯坦納樹
又是圖論裡的乙個可怕的資料結構。斯坦納樹的定義 給定個無向圖和圖上的一些點組成的點集,那麼能使這些點集連通的該圖的子樹就是該圖對於該點集的一顆斯坦納樹。那麼最小斯坦納樹就是所有斯坦納樹中邊權值和最小的一顆。其實就是最小生成樹問題的乙個衍伸,當這個點集包含圖中所有的點的時候那麼問題便轉換為最小生成樹。...
斯坦納樹模板
出自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 ...
斯坦納樹小結
做題時偶然遇到就學了一下,並不是什麼很難的高科技。最小斯坦納樹和最小生成樹類似,不過為了達到最小開銷,最小斯坦納樹允許加一些額外點。例題 有一張圖,有 k kk 個關鍵點,選出一些邊,使這 k kk 個點形成連通塊,求邊權和的最小值。演算法流程 不難發現,這樣的連通塊一定是棵樹,成環的話隨便去掉環上...