#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<cmath>
using namespace std;
const int N = 210, M = N*N;
const int inf = 0x3f3f3f3f;
struct EG{
int u, v, cap;
EG(){}
EG(int u, int v, int cap): u(u), v(v), cap(cap){}
}eg[M];
int tot, p;
int first[N], Next[M];
void init()
{
tot = p = -1;
memset(first, -1, sizeof(first));
}
void add_edge(int u, int v, int cap)
{
eg[++tot] = EG(u, v, cap);
Next[tot] = first[u], first[u] = tot;
eg[++tot] = EG(v, u, 0);
Next[tot] = first[v], first[v] = tot;
}
int dis[N];
int curr[N];
bool BFS(int s, int t)
{
queue<int>q;
memset(dis, 0x3f, sizeof(dis));
dis[s] = 0;
q.push(s);
while(!q.empty())
{
int u = q.front(); q.pop();
for(int i=first[u]; i!=-1; i=Next[i])
{
EG &e = eg[i];
if(e.cap > 0 && dis[e.v] == inf)
{
dis[e.v] = dis[u] + 1;
q.push(e.v);
}
}
}
return dis[t] != inf;
}
int dinic(int u, int t, int flow)
{
if(u == t) return flow;
for(int i=curr[u]; i!=-1; i=Next[i])
{
curr[u] = i;
EG &e = eg[i];
if(e.cap > 0 && dis[e.v] == dis[u] + 1)
{
int tp = dinic(e.v, t, min(flow, e.cap));
if(tp)
{
e.cap -= tp;
eg[i^1].cap += tp;
return tp;
}
}
}
return 0;
}
int DINIC(int s, int t)
{
int ans = 0;
while(BFS(s,t))
{
int tp;
for(int i=0; i<=t; i++) curr[i] = first[i];
while(tp = dinic(s,t,inf))
ans += tp;
}
return ans;
}
我的模板
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.