一组hack数据
查看原帖
一组hack数据
411157
njw123楼主2022/8/24 23:02

放一组hack数据

4 3
0 0 1 1
1 2
1 3
1 4
0 0

虚假的AC代码

#include<bits/stdc++.h>

using namespace std;

// O(n^2*m)
// 10000以下的点和边随便跑,甚至100000的也能跑
typedef long long LL;
const long long inf = 1ll<<60;
const int V = 1000000;
const int E = 1000000;

template<typename T>
struct FlowGraph{
    int s, t, vtot;
    int head[V], etot;
    int dis[V], cur[V];
    struct edge {
        int v, nxt;
        T f;
    } e[E * 2];
    void addedge(int u, int v, T f, T f2 = 0){
        e[etot]= {v, head[u], f}; head[u] = etot ++;
        e[etot]= {u, head[v], f2}; head[v] = etot ++;
    }

    bool bfs(){
        for(int i = 1; i <= vtot; i ++){
            dis[i] = 0;
            cur[i] = head[i];
        }
        queue<int> q;
        q.push(s); dis[s] = 1;
        while(!q.empty()){
            int u = q.front(); q.pop();
            for(int i = head[u]; ~i; i = e[i].nxt){
                if(e[i].f && !dis[e[i].v]){
                    int v = e[i].v;
                    dis[v] = dis[u] + 1;
                    if(v == t) return true;
                    q.push(v);
                }
            }
        }
        return false;
    }
    T dfs(int u, T m){
        if(u == t) return m;
        T flow = 0;
        for(int i = cur[u]; ~i; cur[u] = i = e[i].nxt){
            if(e[i].f && dis[e[i].v] == dis[u] + 1){
                T f = dfs(e[i].v, min(m, e[i].f));
                e[i].f -= f;
                e[i ^ 1].f += f;
                m -= f;
                flow += f;
                if(!m) break;
            }
        }
        if(!flow) dis[u] = -1;
        return flow;
    }
    T dinic(){
        T flow = 0;
        while(bfs()) flow += dfs(s, numeric_limits<T>::max());
        return flow;
    }
    void init(int s_, int t_, int vtot_){
        s = s_, t = t_, vtot = vtot_;
        etot = 0;
        for(int i = 1; i <= vtot; i ++) head[i] = -1;
    }
};
FlowGraph< long long > g;

int n, m;
int main(){ 
    while(scanf("%d %d", &n, &m), n || m){
        int S = 2 * n + 1, T = S + 1;
        g.init(S, T, T); 
        for(int i = 1; i <= n; i ++){
            int x; scanf("%d", &x);
            g.addedge(2 * i - 1, 2 * i, inf);
            if(x) g.addedge(S, 2 * i - 1, 1), g.addedge(2 * i, T, 0);
            else g.addedge(S, 2 * i - 1, 0), g.addedge(2 * i, T, 1);
        }
        for(int i = 1; i <= m; i ++){
            int u, v; scanf("%d %d", &u, &v);
            g.addedge(2 * u - 1, 2 * v, 1);
            g.addedge(2 * v - 1, 2 * u, 1);
        }
        cout << g.dinic() << endl;
    }
    return 0;
}
2022/8/24 23:02
加载中...