社区讨论

萌新刚学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 条回复,欢迎继续交流。

正在加载回复...