給 定乙個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,對...