我的模板

#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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章