BZOJ2595 Wc2008 遊覽計畫

2022-09-18 09:30:22 字數 1365 閱讀 1953

【題意】

n*m的圖中,有k個關鍵點,除了關鍵點外每個點有點權,請你用最小的費用使得景點之間聯通

【分析】

這是斯坦納樹的模板題

設f[i][s]表示以i為根的子樹內,選擇的關鍵點狀態為s的最小代價

外層列舉狀態s

然後考慮轉移:

1.由自己的其他狀態轉移來f[i][s]=min

2.由其他邊走過來f[i][s]=min

第二個式子這種三角形不等式可以spfa轉移一下

注意這個題是點權,在第一種轉移的時候記得減去算重複的點權即可

【**】

#includeusing

namespace

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...