time limit: 10 sec memory limit: 256 mbsec special judge
submit: 1931 solved: 943
[submit][status][discuss]
第一行有兩個整數,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]的範圍內
ljcc930提供spj
分析:裸的斯坦納樹.
感覺沒什麼好說的,就是要記錄路徑比較麻煩,我的做法是在乙個結構體裡記錄每個f值的地圖,每次更新就在地圖的基礎上更新.
#include #include#include
#include
#include
using
namespace
std;
const
int inf = 0x7ffffff,dx = ,dy = ;
struct
node
e[120
];struct
node2
void
push(node temp)
} f[
12][12][(1
<< 10) + 1
],pos;
int n,m,a[12][12],tot,maxn,ans = inf,b[12][12],vis[12][12
],cnt;
node2 hebing(node2 a,node2 b)
return
temp;
}void spfa(int
sta)
while (!q.empty())}}
}}
}int
main()
}maxn = (1
<< tot) - 1
;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
for (int k = 0; k <= maxn; k++)
f[i][j][k].init();
for (int i = 1; i <= tot; i++)
for (int sta = 0; sta <= maxn; sta++)}}
}spfa(sta);
}pos.init();
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
}for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
if(pos.p[i][j])
for (int i = 1; i <= tot; i++)
printf(
"%d\n
",cnt);
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...