網路流24題 騎士共存問題

2021-08-14 11:55:50 字數 3585 閱讀 7331

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 跑出最大流,即為這個圖的最小點覆蓋...