欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

最大流

程序员文章站 2022-07-01 16:26:58
题目1:Dining POJ - 3281分析:模板(当前弧优化+剪枝)代码:#include #include #include #include #include typedef long long ll;//typedef __int128 lll;#define print(i) cout << "debug: " &...

题目1:Dining POJ - 3281

分析:

模板(当前弧优化+剪枝)

代码:

#include <cstdio>
#include <iostream>
#include <queue>
#include <cstring>
#include <algorithm>
typedef long long ll;
//typedef __int128 lll;
#define print(i) cout << "debug: " << i << endl
#define close() ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
#define mem(a, b) memset(a, b, sizeof(a))
const ll mod = 1e9 + 7;
const int maxn = 2e6;
const int inf = 0x3f3f3f3f;
using namespace std;
struct edge{
     int v, val, nex;
     edge(int a = 0, int b = 0, int c = 0) : v(a), val(b), nex(c){}
}e[100010];
int head[17000], tot, nowcur[maxn];
int depth[17100];
int n, f, d, s, t;

void init()
{
    tot = 0, mem(head, -1);
}

void addedge(int u, int v, int val){
    e[tot] = edge(v, val, head[u]);
    head[u] = tot++;
    e[tot] = edge(u, 0, head[v]);
    head[v] = tot++;
}

bool bfs()
{
     queue<int> q;
     memset(depth, 0, sizeof(depth));
     depth[s] = 1, q.push(s);
     nowcur[s] = head[s];
     while(!q.empty())
     {
        int u = q.front(); q.pop();
        for(int i = head[u]; ~i; i = e[i].nex)
        {
            int v = e[i].v;
            if(!depth[v] && e[i].val > 0)
                depth[v] = depth[u] + 1, q.push(v), nowcur[v] = head[v];
        }
     }
     return depth[t] > 0;
}

int dfs(int u,int flow)
{
    if(u == t)return flow;
    int res = 0;
    for(int i = nowcur[u]; ~i && flow; i = e[i].nex)
    {
        int v = e[i].v;
        nowcur[v] = head[v];
        if(depth[v] == depth[u] + 1 && e[i].val > 0)
        {
            int tmp = dfs(v, min(flow, e[i].val));
            if(!tmp) depth[v] = -1;
            res += tmp, flow -= tmp;
            e[i].val -= tmp, e[i ^ 1].val += tmp;
        }
    }
    return res;
}

int maxflow(){
    int res = 0;
    while(bfs())
        res += dfs(s, inf);
    return res;
}

int main()
{
    while(cin >> n >> f >> d)
    {
        init();
        s = 0, t= f + n * 2 + d + 1;
        for(int i=1;i<=n;i++)
        {
            int n1, n2; cin >> n1 >> n2;
            for(int k = 1; k <= n1; k++)
            {
                int x; cin >> x;
                addedge(x, f + i, 1);
            }
            addedge(f + i, f + i + n, 1);
            for(int k = 1; k <= n2; k++)
            {
                int x; cin >> x;
                addedge(f + n + i, f + n * 2 + x, 1);
            }
        }
        for(int i = 1; i <= f; i++)
            addedge(s, i, 1);
        for(int i = 1; i <= d; i++)
            addedge(f + n * 2 + i, t, 1);
        printf("%d\n",maxflow());
    }
    return 0;
}

本文地址:https://blog.csdn.net/weixin_43987810/article/details/107390040

相关标签: 网络流