首页 > 代码库 > hdu 3549(最大流)

hdu 3549(最大流)

依旧是最大流板子

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;
struct note
{
    int fr,to,c,f;
   note(int a,int b,int x,int y):fr(a),to(b),c(x),f(y) {}
};
const int maxn=1000+100;
const int maxm=30;
const int inf=0x3f3f3f3f;
struct Karp
{
    vector<note> aa;
    vector<int> g[maxm];
    int a[maxm],p[maxm];
    void init(int n)
    {
        for(int i=0;i<n;i++)
            g[i].clear();
        aa.clear();
    }
  void addadge(int x,int y,int z)
  {
      aa.push_back(note(x,y,z,0));
      aa.push_back(note(y,x,0,0));
      int mm=aa.size();
      g[x].push_back(mm-2);
      g[y].push_back(mm-1);
  }
  int maxflow(int s,int t)
  {
      int flow=0;
      while(1)
      {
          memset(a,0,sizeof(a));
          a[s]=inf;
          queue<int> q;
          q.push(s);
          while(q.size())
          {
              int x=q.front();q.pop();
              for(int i=0;i<g[x].size();i++)
              {
                   note &e=aa[g[x][i]];
                  if(!a[e.to]&&(e.c>e.f))
                  {
                      a[e.to]=min(a[x],e.c-e.f);
                      p[e.to]=g[x][i];
                      q.push(e.to);
                  }
              }
              if(a[t]) break;
          }
          if(!a[t]) break;
          for(int i=t;i!=s;i=aa[p[i]].fr)
          {
              aa[p[i]].f+=a[t];
              aa[p[i]^1].f-=a[t];
          }
          flow+=a[t];
      }
      return flow;
  }
};
Karp mmp;
int m,n,t;
int main()
{
    scanf("%d",&t);
     for(int zz=1;zz<=t;zz++)
     {
         scanf("%d%d",&n,&m);
         mmp.init(n);
          for(int i=1;i<=m;i++)
          {
              int x,y,z;
              scanf("%d%d%d",&x,&y,&z);
              mmp.addadge(x,y,z);
          }
          printf("Case %d: %d\n",zz,mmp.maxflow(1,n));
     }
    return 0;
}

 

hdu 3549(最大流)