Cod sursa(job #1453498)

Utilizator DjokValeriu Motroi Djok Data 23 iunie 2015 18:08:37
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include<bits/stdc++.h>
using namespace std;

typedef struct lnod {
    int info;
    lnod *next;
}*nod;

const int INF=0x3f3f3f3f;

int i,n,m,x,y,z,rs,q[1005],a[1005][1005],st,dr,t[1005];
bool viz[1005];
nod lda[1005];

void add(int x,nod &y) {
    nod p=new lnod;
    p->info=x;
    p->next=y;
    y=p;
}

void update() {
    int nod=n,flow=INF;

    for(;nod!=1;nod=t[nod]) flow=min(flow,a[t[nod]][nod]);

    rs+=flow;

    for(nod=n;nod!=1;nod=t[nod]) a[t[nod]][nod]-=flow,a[nod][t[nod]]+=flow;
}

bool bfs() {
     bool u=0;
     memset(viz,0,sizeof(viz));

     viz[1]=q[1]=t[1]=1;
     for(st=dr=1;st<=dr;++st)
      for(nod p=lda[q[st]];p;p=p->next)
      if(a[q[st]][p->info]>0 && !viz[p->info])
      {
        viz[p->info]=1; t[p->info]=q[st]; q[++dr]=p->info;
        if(p->info==n) update(),viz[n]=0,--dr,u=1;
      }

     return u;
}

int main()
{
  ifstream cin("maxflow.in");
  ofstream cout("maxflow.out");

  ios_base::sync_with_stdio(0);

  for(cin>>n>>m;m;--m)
  {
    cin>>x>>y>>z;
    add(y,lda[x]); a[x][y]=z;
    add(x,lda[y]);
  }

  while(bfs());

  cout<<rs<<'\n';

 return 0;
}