首先是几份模版

最大流:虽然EK很慢但是优势就是短。求最小割的时候可以根据增广时的a数组来判断哪些边是割边。然而SAP的最大流版我只会套版,并不知道该如何找到这个割边。在尝试的时候发现了一些问题。所以暂且搁下。这个问题目前先就EK把

struct Edge
{
    int u,v,next;
    LL cap,flow;
}edge[MAXM];
int head[MAXN],tot;

void add_edge(int u,int v,LL cap)
{
    edge[tot].u = u;
    edge[tot].v = v;
    edge[tot].cap = cap;
    edge[tot].next = head[u];
    edge[tot].flow = 0;
    head[u] = tot++;

    edge[tot].u = v;
    edge[tot].v = u;
    edge[tot].cap = 0;
    edge[tot].flow = 0;
    edge[tot].next = head[v];
    head[v] = tot++;
}

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

queue<int>q;
LL a[MAXN];
LL Edmonds_karp(int source,int target)
{
    while (!q.empty()) q.pop();
    int p[MAXN];
    LL F = 0;
    while (true)
    {
       memset(p,-1,sizeof(p));
       q.push(source);
       memset(a,0,sizeof(a));
       a[source] = INF;
       while (!q.empty())
       {
           int u = q.front(); q.pop();
           for (int i = head[u]; i != -1; i = edge[i].next)
           {
               int v = edge[i].v;
               if (!a[v] && edge[i].cap > edge[i].flow)
               {
                   a[v] = min(a[u],edge[i].cap - edge[i].flow);
                   p[v] = i;
                   q.push(v);
               }
           }
       }
       if (a[target] == 0) break;
       for (int i = p[target]; i != -1; i = p[edge[i].u])
       {
           edge[i].flow += a[target];
           edge[i ^ 1].flow -= a[target];
       }
       F += a[target];
    }
    return F;
}
View Code

相关文章:

  • 2020-01-30
  • 2021-10-10
  • 2022-12-23
  • 2022-12-23
  • 2022-02-17
  • 2021-12-03
猜你喜欢
  • 2022-12-23
  • 2021-11-25
  • 2020-01-29
  • 2020-02-03
  • 2021-08-16
  • 2020-01-28
  • 2022-12-23
相关资源
相似解决方案