bzoj2595 Wc2008 遊覽計畫

2022-04-29 21:21:18 字數 1650 閱讀 7561

斯坦納樹

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