codevs 1922 騎士共存問題 最小割

2021-07-30 15:43:21 字數 1340 閱讀 8201

分析:比較經典的最小割題目,我們把橫縱座標之和%2=0的位置標記為二分圖的左半部分,另外的作為右半部份,當然刪除掉的不能用的。

然後s向左半部分連邊,右半部分向t連邊。對於能夠互相到達的點,連長度為inf的邊(保證最小割不會包含可以互相到達的點),然後可以證明互相到達的兩個點,肯定屬於不同的部分,然後跑最小割,答案就是n^2-m-ans.

手殘打錯了一些小細節,,非常不應該啊。。還是打得不是很熟練,要多打。

#include

#include

#include

#include

#define fo(i,a,b) for(int i=a;i<=b;i++)

#define fd(i,a,b) for(int i=a;i>=b;i--)

#define inf 0x7fffffff

using namespace std;

typedef long long ll;

const int n=5e5+5;

int n,m,part1,part2;

const int m=505;

int a[m][m],del[m][m];

const int dx[8]=;

const int dy[8]=;

int tot=1;

int head[n],next[n],go[n],q[n],dis[50001],val[n];

inline void add(int

x,int

y,int z)

inline void ins(int

x,int

y,int z)

ll ans=0;

inline bool bfs()}}

return dis[part2]!=-1;

}inline int dfs(int

x,int f)

}if (!used)dis[x]=-1;

return used;

}inline void dinic()

int main()

part1=1,part2=(n*n+1)/2+1;

fo(i,1,n)

}fo(i,1,n)

fo(j,1,n)

if (del[i][j])continue;

else

if (a[i][j]0,7)

ins(0,a[i][j],1);

}else ins(a[i][j],part2,1);

dinic();

printf("%d\n",n*n-m-ans);

return

0;}

Luogu P3355騎士共存問題(最小割)

題目鏈結 像題面那樣把棋盤染成紅黃點。發現騎士邁一步能到達的點的顏色一定是跟他所在的格仔的顏色不同的。於是 woc哪來的於是?這個性質有這麼明顯嗎?從源點向所有紅點連邊,從所有黃點向匯點連邊,紅點向從它一步能邁到的黃點連邊,然後求出最小割 其實就是最大流啦 用可以站騎士的總點數減去。網路流構圖好喵啊...

P3355 騎士共存問題 最小割

題意 nxn的棋盤 有m個壞點 求能在棋盤上放多少個馬不會互相攻擊 題解 這個題仔細想想居然和方格取數是一樣的 每個馬他能攻擊到的地方的座標 x y 奇偶性不一樣 於是就黑白染色 s 黑 白 t 按條件連黑 白 跑最小割 最大流 感性理解一下 就是先把所有的點都放上 得到最大的收益 然後刪掉一些點使...

洛谷P3355 騎士共存問題(最小割)

傳送門 de了兩個小時的bug愣是沒發現錯在 沒辦法只好重打了一遍竟然1a 我有點想從這裡跳下去了 和方格取數問題差不多,把格仔按行數和列數之和的奇偶性分為黑的和白的,可以發現某種顏色一定只能走到另一種顏色。那麼考慮對所有為奇的黑點,偶的為白點,源點對所有黑點連邊,所有白點對匯點連邊,容量都為 1 ...