click me
考慮建乙個二分圖:互相攻擊的點連邊,求最小覆蓋數
考慮將互相攻擊的點連一條流量為1的邊,然後求最小割
/**************************
au: hany01
date: jan 9th, 2018
prob: luogu2756
email: [email protected]
**************************/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define for(i , j , k) for (int i = (j) , _##end_ = (k) ; i <= _##end_ ; ++ i)
#define fordown(i , j , k) for (int i = (j) , _##end_ = (k) ; i >= _##end_ ; -- i)
#define set(a , b) memset(a , b , sizeof(a))
#define pb push_back
#define mp make_pair
#define x first
#define y second
#define inf (0x3f3f3f3f)
#define mod (1000000007)
using
namespace
std;
typedef
long
long ll;
typedef pair pii;
template
inline
bool chkmax(t &a , t b)
template
inline
bool chkmin(t &a , t b)
int _ , __;
char c_;
inline
int read()
inline
void file()
const
int maxn = 210 , maxnode = 40010 , maxedge = 40010 * 8;
int beg[maxnode] , nex[maxedge] , v[maxedge] , e , n , m , dt[8][2] = , x_ , y_ , vis[maxnode] , n1 , n2 , a[maxn][maxn] , ans , mat[maxnode] , cnt1 , cnt2 , idx[maxn][maxn];
inline
bool isin(int x_ , int y_)
inline
void add(int uu , int vv)
inline
bool dfs(int u)
}return
false;
}int main()
}n2 = n * n - n1;
for(i , 1 , n1)
printf("%d\n" , n * n - m - ans);
return0;}
//雁字無多,寫得相思幾許。
// -- 周密《掃花遊·九日懷歸》
/**************************
au: hany01
date: jan 9th, 2018
prob: luogu2756
email: [email protected]
**************************/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define for(i , j , k) for (int i = (j) , _##end_ = (k) ; i <= _##end_ ; ++ i)
#define fordown(i , j , k) for (int i = (j) , _##end_ = (k) ; i >= _##end_ ; -- i)
#define set(a , b) memset(a , b , sizeof(a))
#define pb push_back
#define mp make_pair
#define x first
#define y second
#define inf (0x3f3f3f3f)
#define mod (1000000007)
using
namespace
std;
typedef
long
long ll;
typedef pair pii;
template
inline
bool chkmax(t &a , t b)
template
inline
bool chkmin(t &a , t b)
int _ , __;
char c_;
inline
int read()
inline
void file()
const
int maxn = 210 , maxnode = 40010 , maxedge = 40010 * 20;
int beg[maxnode] , nex[maxedge] , v[maxedge] , e , n , m , dt[8][2] = , x_ , y_ , a[maxn][maxn] , ans , f[maxedge], gap[maxnode], d[maxnode], s, t;
inline
bool isin(int x_ , int y_)
inline
void add(int uu , int vv, int ff)
int sap(int u, int flow)
if (!--gap[d[u]]) d[s] = t + 1;
++ gap[++ d[u]];
return flow - res;
}#define idx(x, y) ((x - 1) * n + y)
int main()
add(s, idx(i, j), 1), add(idx(i, j), s, 0);
for(k , 0 , 7)
}for (gap[0] = t + 1; d[s] < t + 1; ) ans += sap(s, inf);
printf("%d\n" , n * n - m - ans);
return0;}
//人生若只如初見,何事秋風悲畫扇。
// -- 納蘭性德《木蘭詞·擬古決絕詞柬友》
網路流24題24 騎士共存問題
題面戳我 題目描述 在乙個 nn個方格的西洋棋棋盤上,馬 騎士 可以攻擊的棋盤方格如圖所示。棋盤上某些方格設定了障礙,騎士不得進入 對於給定的 nn 個方格的西洋棋棋盤和障礙標誌,計算棋盤上最多可以放置多少個騎士,使得它們彼此互不攻擊 輸入輸出格式 輸入格式 第一行有 2 個正整數n 和 m 1 n...
網路流24題 騎士共存問題
互不侵犯?這麼多種走位的方式,當然沒有辦法動態規劃啦!反正我不會 網路流可是解決規劃問題的大利器啊!有木有想到二分圖最大點權獨立集呢!黑白染色 向可以走到的地方連邊 跳過障礙物點 求最小割 做完啦!如下 include include include include include define m...
網路流24題 騎士共存問題
題面 傳送門思路 基本上和方格取數問題差不多 這道題可以證明,如果把每兩個不能共存的點連在一起,那麼這個圖沒有奇環,是乙個二分圖 同時,如果把這個影象西洋棋一樣黑白染色,那麼連邊的兩個點顏色不同 源點連黑點,邊權為1 黑點連白點,邊權為inf 白點連匯點,邊權為1 跑出最大流,即為這個圖的最小點覆蓋...