Example #1
0
int main() {
    int N, K;
    scanf("%d%d", &N, &K);

    Dinic dinic;
    const int S = 0, T = 2*N + 1;
    for (int i = 1; i <= N; i++) {
        dinic.addEdge(S, i, 1);
    }
    for (int i = N+1; i <= 2*N; i++) {
        dinic.addEdge(i, T, 1);
    }

    for (int i = 0; i < K; i++) {
        int r, c;
        scanf("%d%d", &r, &c);
        dinic.addEdge(r, N+c, Dinic::inf);
    }
    printf("%d\n", dinic.dinic(S, T));
    return 0;
}
Example #2
0
int main() {
    scanf("%d%d%d%d", &N, &M, &C1, &C2);
    Dinic dinic;
    dinic.addEdge(2*C1, 2*C1+1, Dinic::inf);
    dinic.addEdge(2*C2, 2*C2+1, Dinic::inf);

    for (int i = 1; i <= M; i++) {
        int u, v;
        scanf("%d%d", &u, &v);
        dinic.addEdge(2*u+1, 2*v, Dinic::inf);
        dinic.addEdge(2*v+1, 2*u, Dinic::inf);
    }
    for (int i = 1; i <= N; i++) {
        if (i != C1 && i != C2) {
            dinic.addEdge(2*i, 2*i+1, 1);
        }
    }

    printf("%d\n", dinic.dinic(2*C1, 2*C2+1));
    return 0;
}
Example #3
0
void solve() {
    mp[1].clear();
    mp[2].clear();
    int n1 = 0, n2 = 0;
    for(int i = 1; i <= n; i++) {
        if(mp[1][a[i][1]] == 0) {
            n1++;
            mp[1][a[i][1]] = n1;
            b[i][1] = n1;
        }
        else {
            b[i][1] = mp[1][a[i][1]];
        }
        if(mp[2][a[i][2]] == 0) {
            n2++;
            mp[2][a[i][2]] = n2;
            b[i][2] = n2;
        }
        else {
            b[i][2] = mp[2][a[i][2]];
        }
    }
    g.init();
    int st = n1 + n2 + 1, ed = st + 1;
    for(int i = 1; i <= n1; i++) {
        g.addEdge(st, i, 1);
    }
    for(int i = 1; i <= n2; i++) {
        g.addEdge(i + n1, ed, 1);
    }
    for(int i = 1; i <= n; i++) {
        g.addEdge(b[i][1], n1 + b[i][2], 1);
    }
    int ans = g.Maxflow(st, ed, INF);
    //printf("%d  %d %d\n", n1, n2, ans);
    printf("%d\n", n - (n2 - ans) - n1);
}