最大费用最大流模版(Tyvj-P1413 - N取方格数)(ZKW费用流)

用于ZKW费用流不能直接用于有负权边的图中,所以我们要先用SPFA跑一次最短路,然后利用最短路修改每个点的顶标来重新构造层次图,保证在找最短增广路的过程中,顶标是不递减的。

代码:

#include 
#include 
#include 
#include 
#include 
 
using namespace std;
 
#define MAXN 101
#define MAXM 21
#define MAXV MAXN*MAXM*2+10
#define inf 0x7fffffff
 
struct edge {
        int t,f,c;
        edge *pair,*next;
        edge () {
               pair=next=NULL;
        }
} *head[MAXV];
 
void Add(int s,int t,int f,int c) {
        edge *p=new(edge);
        p->t=t;
        p->f=f;
        p->c=c;
        p->next=head[s];
        head[s]=p;
}
 
void AddEdge(int s,int t,int f,int c) {
        Add(s,t,f,c);
        Add(t,s,0,-c);
        head[s]->pair=head[t];
        head[t]->pair=head[s];
}
 
int n,m,V=0,S,T,k;
int v[MAXN][MAXM][2];
int w[MAXN][MAXM];
 
void INIT() {
        memset(head,0,sizeof(head));
        scanf("%d%d%d",&k,&m,&n);
        for (int i=0;i++Q;
 
void spfa() {
        for (int i=0;i++next) {
                       if (p->f&&d[p->t]>d[v]+p->c) {
                               d[p->t]=d[v]+p->c;
                               f[p->t]=true;
                               Q.push(p->t);
                       }
               }
        }
}
 
int dist[MAXV],slack[MAXV];
int cost=0;
 
void dfs(int v) {
        f[v]=false;
        for (edge *p=head[v];p;p=p->next) {
               if (p->f&&d[v]+p->c==d[p->t]&&f[p->t]) {
                       dist[p->t]=dist[v]-p->c;
                       dfs(p->t);
               }
        }
}
 
int aug(int v,int flow) {
        if (v==T) {
               cost+=flow*(dist[S]-dist[T]);
               return flow;
        }
        f[v]=false;
        int rec=0;
        for (edge *p=head[v];p;p=p->next) {
               if (p->f&&f[p->t]) {
                       if (dist[v]==dist[p->t]+p->c) {
                               int ret=aug(p->t,min(flow-rec,p->f));
                               p->f-=ret,p->pair->f+=ret;
                               if ((rec+=ret)==flow) return flow;
                       } else slack[p->t]=min(slack[p->t],dist[p->t]-dist[v]+p->c);
               }
        }
        return rec;
}
 
bool relabel() {
        int delta=inf;
        for (int i=0;i++

你可能感兴趣的:(最大费用最大流模版(Tyvj-P1413 - N取方格数)(ZKW费用流))