Cod sursa(job #303874)

Utilizator IeewIordache Bogdan Ieew Data 10 aprilie 2009 14:17:41
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include <fstream>
#include <vector>
using namespace std;
#define InFile "maxflow.in"
#define OutFile "maxflow.out"
#define MAXN 1001 
#define INF 0x3f3f3f3f
int c[MAXN][MAXN],f[MAXN][MAXN],sol=0,n,m,viz[MAXN],coada[MAXN],t[MAXN];
vector<int>g[MAXN];

void citire()
{int i,x,y,z;
ifstream in(InFile);
in>>n>>m;
for(i=1;i<=m;i++)
    {
     in>>x>>y>>z;
     c[x][y]=z;
     g[x].push_back(y);
     g[y].push_back(x);   
    }
in.close();   
}

int bfs()
{int i,u,j,nod,x;
for(i=1;i<=n;i++)viz[i]=0;
coada[1]=1;
u=1;
for(i=1;i<=u;i++)  
{
    nod=coada[i];
    if(nod==n)continue;
    for(j=0;j<g[nod].size();j++)
    {
        x=g[nod][j];
        if(f[nod][x]==c[nod][x]||viz[x])continue;
        viz[x]=1;
        coada[++u]=x;
        t[x]=nod;
    }
}
return viz[n];    
}
int minim(int a,int b)
{return a<b?a:b;}

int main()
{int i,nod,j,x,min;
citire();    
while(bfs())
        for(i=0;i<g[n].size();i++)
            {
                nod=g[n][i];
                if(!viz[nod]||f[nod][n]==c[nod][n])continue;
                t[n]=nod;
                min=INF;
                for(nod=n;nod!=1;nod=t[nod])
                    min=minim(min,c[t[nod]][nod]-f[t[nod]][nod]);
                if(!min)continue;
                sol+=min;
                for(nod=n;nod!=1;nod=t[nod])
                    {
                        f[t[nod]][nod]+=min;
                        f[nod][t[nod]]-=min;                        
                    }
            }
ofstream out(OutFile);
out<<sol<<'\n';
out.close();
return 0;
}