最大流ISAP模板

來源:互聯網
上載者:User


POJ1273Drainage
Ditches(網路最大流裸題)

ISAP + 鄰接矩陣

// Nero//鄰接矩陣#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;#define FOR(i,a,b) for(int i=(a); i<=(b); i++)#define REP(i,a,b) for(int i=(a); i<(b); i++)#define clr(a,b) memset(a,b,sizeof(a))const int INF = ~0u>>1;const int MAXN = 210;int g[MAXN][MAXN];int gap[MAXN],dis[MAXN],pre[MAXN],cur[MAXN];int n;int Isap(int s, int t, int nodenum) {clr(gap,0); clr(dis,0); clr(cur,0);int u = pre[s] = s, maxflow = 0, aug = INF;gap[0] = nodenum;while(dis[s] < nodenum) {loop: FOR(v,cur[u],nodenum) if(g[u][v] && dis[u] == dis[v] + 1) {aug = min(aug,g[u][v]);pre[v] = u;u = cur[u] = v;if(v == t) {maxflow += aug;for(u = pre[u]; v != s; v = u, u = pre[u]) {g[u][v] -= aug;g[v][u] += aug;}aug = INF;}goto loop;}int mindis = nodenum - 1;FOR(v,0,nodenum) if(g[u][v] && mindis > dis[v]) {cur[u] = v;mindis = dis[v];}if((--gap[dis[u]]) == 0) break;gap[dis[u] = mindis+1] ++;u = pre[u];}return maxflow;}int main() {int m;while(~scanf("%d%d", &m, &n)) {clr(g,0);int a,b,c;while(m--) {scanf("%d%d%d", &a, &b, &c);g[a][b] += c;}printf("%d\n", Isap(1,n,n));}return 0;}

ISAP + 鄰接表

#include <stdio.h>  #include <string.h>  #include <algorithm>  using namespace std;  const int MAXN=10100;  const int INF = ~0u>>1;#define clr(a,b) memset(a,b,sizeof(a))#define FOR(i,a,b) for(int i=(a); i<=(b); i++)#define REP(i,a,b) for(int i=(a); i<(b); i++)struct EDGE  {      int v,c,next;  }edge[101000];  int E,head[MAXN];  int gap[MAXN], cur[MAXN], pre[MAXN], dis[MAXN];void add_edge(int s,int t,int c,int cc = 0)  {      edge[E].v=t;    edge[E].c=c;      edge[E].next=head[s];   head[s]=E++;      edge[E].v=s;    edge[E].c=cc;      edge[E].next=head[t];   head[t]=E++;  }  int min(int a,int b){return (a==-1||b<a)?b:a;}  int SAP(int s,int t,int n)  {      memset(gap,0,sizeof(gap));      memset(dis,0,sizeof(dis));      int i;      for(i=0;i<n;i++)cur[i]=head[i];      int u=pre[s]=s,maxflow=0,aug=-1,v;      gap[0]=n;          while(dis[s]<n)      {  loop:    for(i=cur[u];i!=-1;i=edge[i].next)           {               v=edge[i].v;               if(edge[i].c>0&&dis[u]==dis[v]+1)               {                   aug=min(aug,edge[i].c);                   pre[v]=u;                   cur[u]=i;                   u=v;                   if(u==t)                   {                       for(u=pre[u];v!=s;v=u,u=pre[u])                       {                           edge[cur[u]].c-=aug;                           edge[cur[u]^1].c+=aug;                       }                       maxflow+=aug;                       aug=-1;                   }                   goto loop;               }           }           int mindis=n;           for(i=head[u];i!=-1;i=edge[i].next)           {               v=edge[i].v;               if(edge[i].c>0&&dis[v]<mindis)               {                   cur[u]=i;                   mindis=dis[v];               }           }           if((--gap[dis[u]])==0)break;           gap[dis[u]=mindis+1]++;           u=pre[u];      }      return maxflow;  }int main() {    int n,m;    while(~scanf("%d%d", &m, &n)) {        E = 0;        clr(head, -1);        int a,b,c;        REP(i,0,m) {            scanf("%d%d%d", &a, &b, &c);            add_edge(a,b,c);        }        printf("%d\n", SAP(1,n,n+1));    }    return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.