社区讨论

萌新 妹子 刚学OI 迷之WA#6 调了一晚上了QAQ

P2472[SCOI2007] 蜥蜴参与者 6已保存回复 9

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
9 条
当前快照
1 份
快照标识符
@mi86kr08
此快照首次捕获于
2025/11/21 09:27
4 个月前
此快照最后确认于
2025/11/21 09:27
4 个月前
查看原帖
求大佬查错QAQQAQ是真的没找到WAWA在哪里了
CPP
#include <bits/stdc++.h>
#define INF (1000000000 + 7)
#define N (10005 + 5)
#define int long long
using namespace std;
inline int read(){
    int cnt = 0, f = 1; char c;
    c = getchar();
    while (!isdigit(c)) {
        if(c == '-') f = -f;
        c = getchar();
    }
    while (isdigit(c)) {
        cnt = cnt * 10 + c - '0';
        c = getchar();
    }	
    return cnt * f;
}
int r, c, d, tot = 1, n;
int S, T;
int first[N], nxt[N], to[N], flow[N];
int mapp[N][N], a[N][N];
int dep[N], cnt[N];
char lizard[N][N];
void Add(int x, int y, int z) {
    nxt[++tot] = first[x], first[x] = tot, to[tot] = y, flow[tot] = z;
    nxt[++tot] = first[y], first[y] = tot, to[tot] = x, flow[tot] = 0;
} 
bool pd(int i, int j) {
    if (i <= d || j <= d) return true;
    if (r - i + 1 <= d || c - j + 1 <= d) return true;
    return false;
}
void build() {
    S = 1;
    for (register int i = 1; i <= r; i++)
        for (register int j = 1; j <= c; j++)
            a[i][j] = ++tot;

    for (register int i = 1; i <= r; i++)
        scanf("%s", lizard[i] + 1);
    for (register int i = 1; i <= r; i++)
        for (register int j = 1; j <= c; j++)
            mapp[i][j] = lizard[i][j] - '0';
    T = r * c * 2 + 2, tot = 1;

    for (register int i = 1; i <= r; i++)
            scanf("%s", lizard[i] + 1);	
    
    for (register int i = 1; i <= r; i++)
        for (register int j = 1; j <= c; j++) 
            if (mapp[i][j]) {
                Add(a[i][j], a[i][j] + r * c, mapp[i][j]);
                if (pd(i, j)){
					 Add(a[i][j] + r * c, T, INF);
					 cout<<i<<" "<<j<<endl;
				}
            }
            
    for (register int i = 1; i <= r; i++)
        for (register int j = 1; j <= c; j++) 
            for (register int k = 1; k <= r; k++) 
                for (register int p = 1; p <= c; p++) {
                    if (i == k && j == p) continue;
                    if (mapp[i][j] && mapp[k][p])
                    if ((i - k) * (i - k) + (j - p) * (j - p) <= d * d)
                        Add(a[i][j] + r * c, a[k][p], INF);
//						Add(a[k][p] + r * c, a[i][j], INF);
                    }
    for (register int i = 1; i <= r; i++)
        for (register int j = 1; j <= c; j++)
            if (lizard[i][j] == 'L') Add(S, a[i][j], 1), ++n;
}
void bfs_(int s) {
    memset(dep, 0xff, sizeof(dep));
    dep[s] = 0;
    cnt[0] = 1;
    queue<int> q;
    q.push(s);
    while (!q.empty()) {
        int p = q.front();
        q.pop();
        for (register int i = first[p]; i >= 2; i = nxt[i]) {
            int v = to[i];
            if (dep[v] == -1) {
                ++cnt[dep[v] = dep[p] + 1];
                q.push(v);
            }
        }
    }
}

int max_flow;

int dfs_(int p, int f) {
    if (p == T) {
        max_flow += f;
        return f;
    }
    int u = 0;
    for (register int i = first[p]; i >= 2; i = nxt[i]) {
        int v = to[i];
        if (flow[i] && dep[v] == dep[p] - 1) {
            int uu = dfs_(v, min(flow[i], f - u)); 
            if (uu) {
                flow[i] -= uu;
                flow[i ^ 1] += uu;
                u += uu;
            }
            if (u >= f) {
                return u;
            }
        }
    }
    if (!--cnt[dep[p]]) {
        dep[S] = r * c * 2 + 10;
    }
    ++cnt[++dep[p]];
    return u;
}
signed main() {
    r = read(); c = read(); d = read();
    build();
    bfs_(T);
    while (dep[S] < 2 * r * c + 9) dfs_(S, INF);
    printf("%lld", n - max_flow);
    return 0;
}

回复

9 条回复,欢迎继续交流。

正在加载回复...