SAP模板经典

#include <stdio.h>
#include <string.h>
#include <vector>
#include <queue>
#include <algorithm>
#include <iostream>
using namespace std;
#define inf 0x7fffffff
typedef long long ll;
const int mod=10007;
const int N =222;

struct po {
  int b,c;
  int nxt;
}e[99999];
int cnt;
int p[N];
int n,m;

int pre[N];
int dis[N];
int gap[N];
int cur[N];
int sap(int s, int t,int n) {
   int i,v,u,c;
   int maxflow=0;
   int aug=-1;
   for(i=0;i<=n;i++) cur[i]=p[i];
   memset(dis,0,sizeof(dis));
   memset(gap,0,sizeof(gap));
   u=pre[s]=s,
   gap[0]=n;
   while(dis[s]<n) {
loop:
      for(int &ee=cur[u];ee!=-1;ee=e[ee].nxt) {
         v=e[ee].b;
         c=e[ee].c;
         if(c>0&&dis[u]==dis[v]+1) {

            if(aug==-1||aug>c) aug=c;

            pre[v]=u;
            u=v;

            if(v==t) {
               maxflow+=aug;
               for(u=pre[u];v!=s;v=u,u=pre[u])
                  e[ cur[u] ].c-=aug , e[ cur[u]^1 ].c+=aug;
               aug=inf;
             }
            goto loop;
         }
      }

      int mindis = n;
      for(i=p[u];i!=-1;i=e[i].nxt) {
         v=e[i].b;
         if(e[i].c>0&&mindis>dis[v])
            cur[u]=i , mindis=dis[v];
      }

      if((--gap[dis[u]])==0) break;
      gap[dis[u]=mindis+1]++;
      u=pre[u];
   }
   return maxflow;
}

void addedge(int a,int b,int c) {
   e[cnt].b=b; e[cnt].c=c; e[cnt].nxt=p[a]; p[a]=cnt++;
   e[cnt].b=a; e[cnt].c=0; e[cnt].nxt=p[b]; p[b]=cnt++;
}
void init() {
   memset(p,-1,sizeof(p));
   cnt=0;
}

int main()
{
   int a,b,c;
   int i,t;
   scanf("%d",&t);
   while(t--){
      scanf("%d%d",&n,&m);

      init();

      for(i=1;i<=m;i++) {
         scanf("%d%d%d",&a,&b,&c);
         addedge(a,b,c);
      }

      int ans=sap(1,n,n);

      static int p=0;
      printf("Case %d: %d\n",++p,ans);
   }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值