【題意】
n*m的圖中,有k個關鍵點,除了關鍵點外每個點有點權,請你用最小的費用使得景點之間聯通
【分析】
這是斯坦納樹的模板題
設f[i][s]表示以i為根的子樹內,選擇的關鍵點狀態為s的最小代價
外層列舉狀態s
然後考慮轉移:
1.由自己的其他狀態轉移來f[i][s]=min
2.由其他邊走過來f[i][s]=min
第二個式子這種三角形不等式可以spfa轉移一下
注意這個題是點權,在第一種轉移的時候記得減去算重複的點權即可
【**】
#includeusingnamespace
std;
#define mp make_pair
#define fi first
#define se second
#define lson now<<1
#define rson now<<1|1typedef
long
long
ll;typedef pair
pii;
const
int inf=0x3f3f3f3f
;const
int maxn=1025
;int
n,m;
int a[12][12],f[12][12
][maxn];
int cnt,vis[12][12
];int
posx,posy;
struct
path
pre[
12][12
][maxn];
int dx[4]=;
int dy[4]=;
queue
q;void spfa(int
st);
if(!vis[tox][toy])}}
}}void dfs(int x,int y,int
st)int
main()
}for(int s=0;s<(1
<);}
}if(f[i][j][s]1
; }
spfa(s);
}printf(
"%d\n
",f[posx][posy][(1
<1
]); memset(vis,
0,sizeof
(vis));
dfs(posx,posy,(
1<1
);
for(int i=1;i<=n;i++)
}printf("\n
");}
return0;
}
BZOJ 2595 Wc2008 遊覽計畫
啊 斯坦納樹 好像很厲害啊 反正我之前不會。其實不知道實用性怎麼樣 畢竟複雜度不小。大概過程就是乙個狀壓dp spfa 列舉狀態 從小狀態更新大狀態 再對當前狀態做一次像spfa一樣的鬆弛操作 下面這個人講的不錯 可以去看看 為什麼我的 又那麼短 有點擔心優美度了 有誰提一下建議嗎2333 我覺得還...
BZOJ 2595 Wc2008 遊覽計畫
n m 的網格,如果 a 0 則表示景點,否則表示這裡的需要的志願者人數。求一種安排志願者的方案使得所有景點連通且志願者最少。本題可以插頭dp,然而有乙個東西叫斯坦納樹,來學習學習。令 f i,j,s 表示 i,j 為根,連通性為 s 的最少志願者。則有轉移 f i,j,s min begin f ...
bzoj2595 Wc2008 遊覽計畫
斯坦納樹 f i zt 表示以i為根,連成的聯通塊包括那些景點 兩個轉移 f i zt f i tzt f i zt tzt a i f i zt f j zt a i i,j 相鄰 後面這個可以用spfa優化 記得先進行前乙個轉移,還有容斥減掉a i include include include...