放一组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;
}