Cod sursa(job #1166945)

Utilizator Daniel3717Aleca Daniel Adrian Daniel3717 Data 3 aprilie 2014 23:47:28
Problema Flux maxim Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 2.56 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;
#define maxn 1005
vector <int> muchii[maxn];
vector <int> analyze,path;
vector <pair<int,int> > v;
int m[maxn][maxn];
int n,nm,i,x,y,c,b,now,i1,to,cap,inod,mn,last,flux,inow,ito;
int inside[maxn];
int main(void)
{
    FILE * f;
    f=fopen("maxflow.in","r");
    ofstream g("maxflow.out");
    fscanf(f,"%d%d",&n,&nm);
    for (i=1;i<=nm;i++)
    {
        fscanf(f,"%d%d%d",&x,&y,&c);
        muchii[x].push_back(y);
        m[x][y]=c;
        muchii[y].push_back(x);
        m[y][x]=0;
    }

    b=1;
    while (b==1)
    {
        b=0;
        analyze.clear();
        v.clear();
        v.push_back(make_pair(1,0));
        memset(inside,0,sizeof(inside));
        inside[1]=1;
        for (i=0;i<v.size();i++)
        {
            now=v[i].first;
            for (i1=0;i1<muchii[now].size();i1++)
            {
                to=muchii[now][i1];
                cap=m[now][to];
                if (cap!=0)
                {
                    if (to==n)
                        analyze.push_back(i);
                    else
                        if (inside[to]==0)
                        {
                            v.push_back(make_pair(to,i));
                            inside[to]=1;
                        }
                }
            }
        }

        for (i=0;i<analyze.size();i++)
        {
            inod=analyze[i];
            path.clear();
            path.push_back(inod);
            now=v[inod].first;
            mn=m[now][n];

            while (inod>0)
            {
                now=v[inod].first;
                inod=v[inod].second;
                last=v[inod].first;
                if (m[last][now]==0)
                    inod=-1;
                else
                {
                    mn=min(mn,m[last][now]);
                    path.push_back(inod);
                }
            }
            if (inod==0)
            {
                flux=flux+mn;

                b=1;

                for (i1=path.size()-1;i1>=1;i1--)
                {
                    inow=path[i1];
                    now=v[inow].first;
                    ito=path[i1-1];
                    to=v[ito].first;
                    m[now][to]-=mn;
                    m[to][now]+=mn;
                }

                inod=analyze[i];
                now=v[inod].first;
                m[now][n]-=mn;
            }

        }
    }

    g<<flux;
    g.close();
    return 0;
}