Cod sursa(job #1815274)

Utilizator stelian2000Stelian Chichirim stelian2000 Data 24 noiembrie 2016 23:31:40
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.01 kb
#include <cstdio>
#include <queue>
#include <vector>

using namespace std;

const int INF=1e9;

struct edge
{
    int x,y,cap,flow,inv;
};

vector<edge> muc;
vector<int> v[1010];
int vaz[1010],n,m,tata[1010];

void add_edge(int x,int y,int cap)
{
    int a=muc.size();
    muc.push_back({x,y,cap,0,a+1});
    muc.push_back({x,y,0,0,a});
    v[x].push_back(a);
    v[y].push_back(a+1);
}

int bfs(int sursa,int dest)
{
    for(int i=1;i<=n;i++) vaz[i]=0;
    queue<int> q;
    q.push(sursa);
    vaz[sursa]=1;
    while(!q.empty())
    {
        int nod=q.front();
        q.pop();
        for(int i=0;i<v[nod].size();i++)
        {
            int a=v[nod][i];
            int vec=muc[a].x^muc[a].y^nod;
            if(vaz[vec]==0 && muc[a].flow<muc[a].cap)
            {
                vaz[vec]=1;
                if(vec!=dest) q.push(vec);
                tata[vec]=a;
            }
        }
    }
    return vaz[dest];
}

int main()
{
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);
    int x,y,cap,flux=0;
    scanf("%d%d",&n,&m);
    int dest=n,sursa=1;
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%d",&x,&y,&cap);
        add_edge(x,y,cap);
    }
    while(bfs(sursa,dest)>0)
    {
        for(int i=0;i<v[dest].size();i++)
        {
            int a=v[dest][i];
            int vec=muc[a].x^muc[a].y^dest;
            if(vaz[vec]==1 && muc[muc[a].inv].cap>muc[muc[a].inv].flow)
            {
                tata[dest]=muc[a].inv;
                int s=INF;
                for(int nod=dest;nod!=sursa;nod=muc[tata[nod]].x^muc[tata[nod]].y^nod)
                    s=min(s,muc[tata[nod]].cap-muc[tata[nod]].flow);
                for(int nod=dest;nod!=sursa;nod=muc[tata[nod]].x^muc[tata[nod]].y^nod)
                {
                    muc[tata[nod]].flow+=s;
                    muc[muc[tata[nod]].inv].flow-=s;
                }
                flux+=s;
            }
        }
    }
    printf("%d",flux);
    return 0;
}