斯坦納樹
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
#include
#include
#include
#define p(x,y) m*(x-1)+y
using
namespace
std;
const
int dx[4]=;
const
int dy[4]=;
int c[110
];int cnt,f[110][2100],fr[110][2100
];struct
node
a[410];int len,last[110
];void ins(int x,int
y)int head,tail,list[110]; bool v[110
];void add(int &x)
void spfa(int
zt) }
}v[x]=false
; add(head);
}}char ss[110
];void dfs(int x,int
zt)int
main()
}//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~init~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
int li=(1
<1; head=1,tail=1
;
for(int zt=1;zt<=li;zt++)
memset(v,
false,sizeof
(v));
for(int i=1;i<=n*m;i++)
if(f[i][zt]!=f[0][0
])
spfa(zt);
}//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~dp~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
int mmin=f[0][0
],id;
for(int i=1;i<=n*m;i++)
if(f[i][li]i;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(c[p(i,j)]==0)ss[p(i,j)]='x'
;
else ss[p(i,j)]='_'
; dfs(id,li);
printf(
"%d\n
",mmin);
for(int i=1;i<=n;i++)
//~~~~~~~~~~~~~~~~~~~~~~~~~print~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
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 遊覽計畫
time limit 10 sec memory limit 256 mbsec special judge submit 1931 solved 943 submit status discuss 第一行有兩個整數,n和 m,描述方塊的數目。接下來 n行,每行有 m 個非負整數,如果該整數為 0,...