BZOJ3175 Tjoi2013 攻擊裝置

2022-05-08 07:48:10 字數 1755 閱讀 4357

給 定乙個01矩陣,其中你可以在0的位置放置攻擊裝置。每乙個攻擊裝置(x,y)都可以按照「日」字攻擊其周圍的 8個位置(x-1,y-2),(x-2,y-1),(x+1,y-2),(x+2,y-1),(x-1,y+2),(x-2,y+1), (x+1,y+2),(x+2,y+1)

求在裝置互不攻擊的情況下,最多可以放置多少個裝置。

第一行乙個整數n,表示矩陣大小為n*n。接下來n行每一行乙個長度n的01串,表示矩陣。

乙個整數,表示在裝置互不攻擊的情況下最多可以放置多少個裝置。

3010

000100

4100%資料 n<=200

正解:二分圖最大匹配(匈牙利演算法)

解題報告:

顯然,被某個點走到的點都不能與它共存,不妨給他們連邊,然後求乙個二分圖最大獨立子集。

二分圖最大獨立子集就是等於總點數減去匹配數。因為每一次匹配完之後,就會多一條邊,意味著邊連線的兩個點只能選乙個,所以就少了乙個。

有所優化的就在於不用memset陣列,直接給訪問陣列乙個每次dfs特有的標記即可。

1

//it is made by jump~

2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include

13#ifdef win32

14#define ot "%i64d"

15#else

16#define ot "%lld"

17#endif

18using

namespace

std;

19 typedef long

long

ll;20

const

int maxm = 1000011;21

const

int maxn = 211;22

intn,ecnt;

23int yi[4][2]=,,,};//

只處理往右的

24int first[maxn*maxn],to[maxm],next[maxm];

25int

a[maxn][maxn];

26int vis[40011

];27

int match[maxn*maxn],jilu;

28int

ans,flag,tot;

2930 inline int

getint()

3139

40 inline void link(int x,int

y)44

45 inline bool dfs(int

x)53}54

return

false;55

}5657 inline void

work()

67int

x,y;

68for(int i=1;i<=n;i++)

69for(int j=1;j<=n;j++) 77}

78 ans=0;//

注意初值

79for(int i=1;i<=tot;i++)

83//

點數減去最大匹配數即最大獨立集

84 printf("

%d\n

",tot-ans/2

);85}86

87int

main()

88

Bzoj 3175 Tjoi2013 攻擊裝置

給定乙個01矩陣,其中你可以在0的位置放置攻擊裝置。每乙個攻擊裝置 x,y 都可以按照 日 字攻擊其周圍的 8個位置 x 1,y 2 x 2,y 1 x 1,y 2 x 2,y 1 x 1,y 2 x 2,y 1 x 1,y 2 x 2,y 1 求在裝置互不攻擊的情況下,最多可以放置多少個裝置。第一...

BZOJ3175 Tjoi2013 攻擊裝置

bzoj3175 tjoi2013 攻擊裝置 給定乙個01矩陣,其中你可以在0的位置放置攻擊裝置。每乙個攻擊裝置 x,y 都可以按照 日 字攻擊其周圍的 8個位置 x 1,y 2 x 2,y 1 x 1,y 2 x 2,y 1 x 1,y 2 x 2,y 1 x 1,y 2 x 2,y 1 求在裝置...

BZOJ5334 Tjoi2018 數學計算

time limit 10 sec memory limit 256 mb submit 234 solved 155 小豆現在有乙個數x,初始值為1.小豆有q次操作,操作有兩種型別 1 m x x m 輸出 x mod 2 pos x x 第pos次操作所乘的數 保證第pos次操作一定為型別1,對...