題意:給你一副圖, 有草地(*),空地(o)和牆(#),空地上可以放機械人, 機械人向上下左右4個方向開槍(槍不能穿牆),問你在所有機械人都不相互攻擊的情況下能放的最多的機器人數。
思路:這是一類經典題的衍化,如果沒有牆,我們會將行和列看成兩列點陣,然後就可以用二分匹配解。
現在有牆怎麼辦呢, 把某一行或列(有牆的拆分成多個區域,可以看成多個行或列), 拆好以後更沒有牆的做法一樣了。
#include #include #include #include using namespace std;
const int maxn = 1505;
vector edge[maxn]; //記錄以左排點為起點的單向邊
int pre[maxn]; //右點陣的大小
bool vis[maxn]; //右點陣的大小
int n, m;
bool dfs(int u)
} return 0;
}char mp[51][51];
int num[51][51];
int nx, ny, x[maxn][maxn], y[maxn][maxn];
int main()
memset(y, -1, sizeof(y));
ny = 0;
for(j = 0; j < m; j++)
for(i = 0; i < nx; i++) edge[i].clear();
for(i = 0; i < n; i++)
for(j = 0; j < m; j++)
if(mp[i][j] == 'o')
edge[x[i][j]].push_back(y[i][j]);
memset(pre, -1, sizeof(int)*ny);
//建邊
int cnt = 0;
for(i = 0; i < nx; i++)
printf("case :%d\n%d\n", ca++, cnt);
} return 0;
}
二分 二分匹配
給了乙個矩陣 n行m列 選n個數 要保證這n個數不在同行同列,計算出第k大的數最小 二分答案,然後我們對於每個a i j mid的我們就i和j建立一條邊 然後二分求最大匹配必須大於等於n k 1 因為是第k大 而不是第k小 坑了好久才發現 include include include includ...
二分匹配演算法
匈牙利演算法求二分匹配 下 include includeusing namespace std int v 頂點數 vectorg max v 圖的鄰接表表示 int match max v 所匹配的頂點 bool used max v dfs 中用到的訪問標記 向圖中增加一條連線 u 和 v 的...
過山車 (二分匹配)
rpg girls今天和大家一起去遊樂場玩,終於可以坐上夢寐以求的過山車了。可是,過山車的每一排只有兩個座位,而且還有條不成文的規矩,就是每個女生必須找個個男生做partner和她同坐。但是,每個女孩都有各自的想法,舉個例子把,rabbit只願意和xhd或pqk做partner,grass只願意和l...