bzoj2595 Wc2008 遊覽計畫

2022-05-02 05:03:09 字數 2196 閱讀 1461

第一行有兩個整數,n和 m,描述方塊的數目。

接下來 n行, 每行有 m 個非負整數, 如果該整數為 0, 則該方塊為乙個景點;

否則表示控制該方塊至少需要的志願者數目。 相鄰的整數用 (若干個) 空格隔開,

行首行末也可能有多餘的空格。

由 n + 1行組成。第一行為乙個整數,表示你所給出的方案

中安排的志願者總數目。

接下來 n行,每行m 個字元,描述方案中相應方塊的情況:

z  『_』(下劃線)表示該方塊沒有安排志願者;

z  『o』(小寫英文本母o)表示該方塊安排了志願者;

z  『x』(小寫英文本母x)表示該方塊是乙個景點;

注:請注意輸出格式要求,如果缺少某一行或者某一行的字元數目和要求不

一致(任何一行中,多餘的空格都不允許出現) ,都可能導致該測試點不得分。

4 4

0 1 1 0

2 5 5 1

1 5 5 1

0 1 1 0

6 xoox

___o

___o

xoox

對於100%的資料,n,m,k≤10,其中k為景點的數目。輸入的所有整數均在[0,2^16]的範圍內

正解:斯坦納樹。

$thusc$的$day1t1$考了斯坦納樹,但是我沒學啊,於是$gg$。。

斯坦納樹大概就是求乙個連通圖滿足某些鬼畜條件的生成樹??其實似乎挺簡單的樣子。。

比如這題,我們要求使得所有關鍵點連通的最小生成樹,那麼我們可以把這些關鍵點狀壓起來。

設$f[i][j][s]$,表示以點$(i,j)$為根,關鍵點狀態為$s$的最小生成樹。

那麼,每一層$s$內,我們先列舉$s$的子集,$f[i][j][s]=min(f[i][j][s],f[i][j][sub]+f[i][j][s-sub]-g[i][j])$,$g[i][j]$為當前根的權值。很顯然,根算了兩次,所以我們要減掉。

子集轉移完以後,我們可以用$spfa$來鬆弛整層,$f[i][j][s]=min(f[i][j][s],f[p][q][s]+dis(i,j,p,q))$。

最後某個關鍵點的全集狀態$f[i][j][s]$就是答案了。。然後這題要輸出方案,我們記錄前驅,搜尋一下狀態樹就好了。

1

//it is made by wfj_2048~

2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include 13 #include

14#define inf (1<<30)

15#define all (1<16

#define il inline

17#define rg register

18#define ll long long

1920

using

namespace

std;

2122

const

int d1[4]=;

23const

int d2[4]=;

2425

int pre[12][12][1

<<11][3],f[12][12][1

<<11],a[12][12],g[12][12],vis[12][12],q1[100010],q2[100010

],n,m,k;

2627 il int

gi()

3435 il void dfs(rg int x,rg int y,rg int

s)39

40 il void spfa(rg int

s)55

}56 vis[x][y]=0;57

}58return;59

}6061 il void

work()

68if (!k)

73return;74

}75for (rg int s=1;ss)83}

84spfa(s);85}

86for (rg int i=1;i<=n;++i)

87for (rg int j=1;j<=m;++j)

96return;97

}98return;99

}100

101int

main()

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