BZOJ 2595 WC2008 遊覽計畫

2022-05-05 20:36:10 字數 1645 閱讀 3451

orz zky神犇

spfa的靈活應用!(好像是求了乙個叫做斯坦納樹的東西……)

o(︶︿︶)o 唉我就是太水了,離散化寫跪了,x*1e5+y*1e4+k,但是這題裡我x和y的範圍是[1,10]所以在y==10的時候會出錯!!

1

//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 }

view code

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