第一行有兩個整數,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...