社区讨论
萌新刚学OI,求神犇帮改代码
P2691逃离参与者 6已保存回复 9
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 9 条
- 当前快照
- 1 份
- 快照标识符
- @mi7uswfr
- 此快照首次捕获于
- 2025/11/21 03:58 4 个月前
- 此快照最后确认于
- 2025/11/21 03:58 4 个月前
写的Dinic,改了一上午没改出来...
CPP#include <bits/stdc++.h>
using namespace std;
namespace kai586123 {
inline int rd() {
int a = 1, b = 0; char c = getchar();
while (!isdigit(c)) a = c == '-' ? 0 : 1, c = getchar();
while (isdigit(c)) b = b * 10 + c - '0', c = getchar();
return a ? b : -b;
}
const int INF = 1 << 30;
int n, m, ans;
struct G {
int to, nxt, f;
} g[100000];
int head[100000], tot = 1;
void addedge(int x, int y, int f) {
g[++tot].to = y, g[tot].f = f,
g[tot].nxt = head[x], head[x] = tot;
}
int s, t, id[200][200][2], num;
int dis[100000], que[500000], l, r;
bool bfs() {
memset(dis, 0, sizeof(dis));
dis[que[l = 0, r = 1] = s] = 1;
while (l != r) {
int x = que[++l];
for (int i = head[x]; i; i = g[i].nxt) {
if (!dis[g[i].to] && g[i].f) {
dis[g[i].to] = dis[x] + 1;
if (g[i].to == t)
return true;
que[++r] = g[i].to;
}
}
}
return dis[t];
}
int dfs(int x, int mf) {
// cerr << x << endl;
if (x == t)
return mf;
int used = 0, tmp;
for (int i = head[x]; i; i = g[i].nxt) {
if (dis[g[i].to] == dis[x] + 1 && g[i].f) {
tmp = dfs(g[i].to, min(g[i].f, mf - used));
if (tmp)
g[i].f -= tmp, g[i ^ 1].f += tmp, used += tmp;
else dis[g[i].to] = -1;
if (used == mf)
break;
}
}
return used;
}
void main() {
n = rd(), m = rd();
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= n; ++j) {
id[i][j][0] = ++num, id[i][j][1] = ++num;
addedge(id[i][j][0], id[i][j][1], 1);
addedge(id[i][j][1], id[i][j][0], 0);
}
s = ++num, t = ++num;
for (int i = 1; i <= m; ++i) {
int x = rd(), y = rd();
addedge(s, id[x][y][0], 1);
addedge(id[x][y][0], s, 0);
}
for (int i = 1; i <= n; ++i) {
addedge(id[1][i][1], t, 1), addedge(t, id[1][i][1], 0);
addedge(id[n][i][1], t, 1), addedge(t, id[n][i][1], 0);
}
for (int i = 2; i < n; ++i) {
addedge(id[i][1][1], t, 1), addedge(t, id[i][1][1], 0);
addedge(id[i][n][1], t, 1), addedge(t, id[i][n][1], 0);
}
for (int i = 1; i <= n; ++i)
for (int j = 1; j < n; ++j) {
addedge(id[i][j][1], id[i][j + 1][0], 1);
addedge(id[i][j + 1][1], id[i][j][0], 1);
addedge(id[j][i][1], id[j + 1][i][0], 1);
addedge(id[j + 1][i][1], id[j][i][0], 1);
addedge(id[i][j][1], id[i][j + 1][0], 0);
addedge(id[i][j + 1][1], id[i][j][0], 0);
addedge(id[j][i][1], id[j + 1][i][0], 0);
addedge(id[j + 1][i][1], id[j][i][0], 0);
}
while (bfs())
ans += dfs(s, INF);
if (ans >= m)
puts("YES");
else puts("NO");
}
}
signed main() {
#ifndef ONLINE_JUDGE
freopen("data.txt", "r", stdin);
#endif
kai586123::main();
return 0;
}
回复
共 9 条回复,欢迎继续交流。
正在加载回复...