orz zky神犇
spfa的靈活應用!(好像是求了乙個叫做斯坦納樹的東西……)
o(︶︿︶)o 唉我就是太水了,離散化寫跪了,x*1e5+y*1e4+k,但是這題裡我x和y的範圍是[1,10]所以在y==10的時候會出錯!!
1view code//bzoj 2595
2 #include3 #include4 #include5 #include6 #include7 #include8 #include9
#define rep(i,n) for(int i=0;i10
#define f(i,j,n) for(int i=j;i<=n;++i)
11#define d(i,j,n) for(int i=j;i>=n;--i)
12using
namespace
std;
13const
int n=13,inf=~0u>>2;14
const
int fx=,
15 fy=;
16 typedef long
long
ll;17
//#define debug
18int n,m,a[n][n],d[n][n],cnt=0;19
int f[n][n][1100],pre[n][n][1100
];20
bool
vis[n][n];
2122
struct node;
23 queueq;
24 inline int pack(int x,int y,int
s)27
28void spfa(int
set)),vis[tx][ty]=1;40
}41}42
}43}44
45void dfs(int i,int j,int
set)
5758
void
solve()66}
67if (f[x][y][set]!=inf)); vis[x][y]=1
;}68}69
spfa(set);70}
71int
x,y;
72 f(i,1,n) f(j,1,m) if (!a[i][j])
73 printf("
%d\n
",f[x][y][(1
<1
]);74
75#ifdef debug
76 f(i,1,n) f(j,1
,m)77 f(k,0,(1
<1
) 78
if (pre[i][j][k]!=inf)
79 printf("
pre[%d][%d][%d]=%d\n
",i,j,k,pre[i][j][k]);
80#endif
81 dfs(x,y,(1
<1
);82 f(i,1,n) f(j,1
,m)88}89
90int
main()
104solve();
105return0;
106 }
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...