Cod sursa(job #902899)

Utilizator the@EyE@Postavaru Stefan the@EyE@ Data 1 martie 2013 17:20:01
Problema Flux maxim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.81 kb
#include<cstdio>
#include<vector>
#include<deque>
#include<cstring>
#include<algorithm>
#define INF 1001

using namespace std;

int cap[INF][INF],flow[INF][INF],n,m,t[INF],ras=0;
bool used[INF];
deque<int> Q;
vector<int> graph[INF];

int bf()
{
    int ret=0;
    //memset(t,sizeof(t),0);
    memset(used,0,sizeof(used));
    Q.clear();
    Q.push_back(1);
    int ind=0;
    while(ind<Q.size())
    {
       // int s=Q.size();
        int nod=Q[ind];
        for(int i=0;i<graph[nod].size();++i)
        {
            int nod2=graph[nod][i];
            if(!used[nod2]&&cap[nod][nod2]-flow[nod][nod2]>0)
        {

            if(nod2==n)ret=1;
            else
            {
                used[nod2]=1;
                t[nod2]=nod;
                Q.push_back(nod2);
            }
        }
        }
        //if(s==Q.size())return ret;
        ++ind;
    }
    return ret;
}

int main()
{
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(int i=0;i<m;++i)
    {
        int x,y,c;
        scanf("%d%d%d",&x,&y,&c);
        cap[x][y]=c;
        graph[x].push_back(y);
    }
    while(bf())
    {
        for(int i=0;i<Q.size();++i)
        {
            int nod=Q[i];
            if(cap[nod][n]-flow[nod][n]>0)
            {
                int minim=cap[nod][n]-flow[nod][n];
                for(int j=nod;j!=1;j=t[j])
                    minim=min(minim,cap[t[j]][j]-flow[t[j]][j]);
                flow[nod][n]+=minim;
                ras+=minim;
                flow[n][nod]-=minim;
                for(int j=nod;j!=1;j=t[j])
                {
                    flow[t[j]][j]+=minim;
                    flow[j][t[j]]-=minim;
                }
            }
        }
    }
    printf("%d\n",ras);
}