Cod sursa(job #1773985)

Utilizator catalin9898Bajenaru Catalin catalin9898 Data 8 octombrie 2016 14:06:40
Problema Flux maxim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include <queue>
#include<vector>
#include <cstdio>
using namespace std;

queue<int>q;
int t[1001],flu[1001][1001],viz[1001],n,m;
vector<int>mu[1001];
int c[1111][1111];

int bfs()
{
    int i,j,p,si,fiu;
    for(i=2;i<=n;i++)
        viz[i]=0;
        q.push(1);
        while(!q.empty())
        {
            p=q.front();
            q.pop();
            if(p==n)continue;
            si=mu[p].size();
            for(i=0;i<si;i++)
            {
                fiu=mu[p][i];
                if(viz[fiu]||c[p][fiu]==flu[p][fiu])continue;
                t[fiu]=p;
                q.push(fiu);
                viz[fiu]=1;

            }

        }
        return viz[n];

}


int main()
{freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
int i,p,a,b,cc,si,j,mi,flux=0;

scanf("%d%d",&n,&m);
for(i=0;i<m;i++)
{
    scanf("%d%d%d",&a,&b,&cc);
    mu[a].push_back(b);
    mu[b].push_back(a);
    c[a][b]=cc;
}
viz[1]=1;
si=mu[n].size();
while(bfs() )
{
    for(j=0;j<si;j++)
    {

        p=mu[n][j];
        if(c[p][n]==flu[p][n]||viz[p]==0)continue;
        i=n;mi=213456789;
        t[n]=p;
        while(i!=1)
            {
             if(mi>c[t[i]][i]-flu[t[i]][i] )mi=c[t[i]][i]-flu[t[i]][i];
             i=t[i];
            }
              if(mi==0)continue;
         i=n;

         while(i!=1)
         {
             flu[t[i]][i]+=mi;
           //  flu[i][t[i]]-=mi;
             i=t[i];
         }

       flux+=mi;
    }


}
printf("%d",flux);





    return 0;
}