日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

P2172 [国家集训队]部落战争 二分图最小不相交路径覆盖

發布時間:2023/11/27 生活经验 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 P2172 [国家集训队]部落战争 二分图最小不相交路径覆盖 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

二分圖最小不相交路徑覆蓋

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 5550;
const int MAXM = 1000005;
const int INF = 1000000050;
int Head[MAXN], cur[MAXN], lev[MAXN], to[MAXM << 1], nxt[MAXM << 1], f[MAXM << 1], ed = 1, S, T;
inline void addedge(int u, int v, int cap)
{to[++ed] = v;nxt[ed] = Head[u];Head[u] = ed;f[ed] = cap;to[++ed] = u;nxt[ed] = Head[v];Head[v] = ed;f[ed] = 0;return;
}
inline bool BFS()
{int u;memset(lev, -1, sizeof(lev));queue<int>q;lev[S] = 0;q.push(S);while (q.size()) {u = q.front();q.pop();for (int i = Head[u]; i; i = nxt[i])if (f[i] && lev[to[i]] == -1) {lev[to[i]] = lev[u] + 1;q.push(to[i]);/*if (to[i] == T){return 1;}magic one way optimize*/}}memcpy(cur, Head, sizeof Head);return lev[T] != -1;
}
inline int DFS(int u, int maxf)
{if (u == T || !maxf) {return maxf;}int cnt = 0;for (int &i = cur[u], tem; i; i = nxt[i])if (f[i] && lev[to[i]] == lev[u] + 1) {tem = DFS(to[i], min(maxf, f[i]));maxf -= tem;f[i] -= tem;f[i ^ 1] += tem;cnt += tem;if (!maxf) {break;}}if (!cnt) {lev[u] = -1;}return cnt;
}
int Dinic()
{int ans = 0;while (BFS()) {ans += DFS(S, 2147483647);}return ans;
}
void init(int SS, int TT)
{memset(Head, 0, sizeof(Head));ed = 1;S = SS;T = TT;return;
}
char ff[205][205];
int dir[5][2];
int aim[205][205];
int cnt = 0;
int main()
{int n, m;int r, c;int u, v;scanf("%d %d %d %d", &n, &m, &r, &c);dir[1][0] = dir[2][1] = r;dir[1][1] = dir[2][0] = c;dir[3][0] = c, dir[4][0] = r;dir[3][1] = -r, dir[4][1] = -c;if(r==c){dir[2][0]=dir[2][1]=dir[4][0]=dir[4][1]=50;}for (int i = 1; i <= n; i++) {scanf("%s", ff[i]+1);}for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {if (ff[i][j] == '.') {aim[i][j] = ++cnt;}}}S = 0, T = 2 * cnt + 1;for (int i = 1; i <= cnt; i++) {addedge(S, i, 1);addedge(cnt + i, T, 1);}for (int i = 1; i <= n; i++)for (int j = 1; j <= m; j++) {if (ff[i][j] == '.') {for (int k = 1; k <= 4; k++) {int dx = i + dir[k][0];int dy = j + dir[k][1];if (dx >= 1 && dx <= n && dy >= 1 && dy <= m) {if (ff[dx][dy] == '.') {u = aim[i][j], v = aim[dx][dy] + cnt;addedge(u, v, 1);//cout<<i<<" "<<j<<" "<<dx<<" "<<dy<<endl;
                        }}}}}cout << cnt - Dinic() << endl;return 0;
}
View Code

?

轉載于:https://www.cnblogs.com/Aragaki/p/10694881.html

總結

以上是生活随笔為你收集整理的P2172 [国家集训队]部落战争 二分图最小不相交路径覆盖的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。