Cod sursa(job #1263266)

Utilizator badea_adi1999Badea Adrian Catalin badea_adi1999 Data 14 noiembrie 2014 12:07:11
Problema Flux maxim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <cstdio>
#include <vector>
#define nmax 1005
using namespace std;
FILE *f=fopen("maxflow.in","r");
FILE *g=fopen("maxflow.out","w");
int c[nmax][nmax],p[nmax][nmax];
int a[nmax],k[nmax],nr,n,m,minim,tot;
bool ok;
vector <int> v[nmax];
vector <int> ::iterator it;

int main()
{int i,j,x,y,z;
fscanf(f,"%d %d",&n,&m);
for (i=1;i<=m;i++)
            {fscanf(f,"%d %d %d",&x,&y,&z);
             c[x][y]=z;
             v[x].push_back(y);
             }
ok=true;
do
{for (i=1;i<=n;i++) a[i]=0;
nr=1;i=1;
k[nr]=1;

while (i<=nr)
        {for (it=v[k[i]].begin();it!=v[k[i]].end();it++)
                    {if (a[*it]==0&&p[k[i]][*it]<c[k[i]][*it])
                                    {a[*it]=k[i];
                                     k[++nr]=*it;}
                     }
         ++i;}
if (a[n]!=0)
        {j=n;
         minim=1<<30;
         while (j!=1)
                {minim=min(minim,c[a[j]][j]-p[a[j]][j]);
                 j=a[j];
                 }
         j=n;
         while (j!=1)
                {p[a[j]][j]+=minim;
                 j=a[j];
                 }
         tot+=minim;
         }
    else ok=false;
}while (ok==true);
fprintf(g,"%d\n",tot);
return 0;
}