Cod sursa(job #1870302)

Utilizator denilucaLuca Denisa deniluca Data 6 februarie 2017 15:54:24
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.77 kb
#include <iostream>
#include <fstream>

using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
int n,m,a,b,x,pt[1001][1001],c[1001],v[1001],fm,t[1001];//t[]=parintii, c[]=coada, pt[][]=pret/cost

struct graf
{
    int nod;
    struct graf *urm;
}*l[1001],*p;

void actualizare(int ns, int dt)
{
    int minn=10000,aux=dt;
    while(aux>ns)
    {
        if(pt[t[aux]][aux]<minn)
           minn=t[aux];
        aux=t[aux];
    }
    fm=fm+minn;//flux maxim
    aux=dt;
    while(aux>ns)
    {
        pt[t[aux]][aux]=pt[t[aux]][aux]-minn;
        pt[aux][t[aux]]=pt[aux][t[aux]]+minn;
        aux=t[aux];
    }
}

int bfs(int ns,int dt)//nod start & destinatie
{
     v[ns]=1;
     int inc=1,sf=1,noda,ok=0;
     c[sf]=ns;
     for(int i=1;i<=n;i++)
         v[i]=0;
     while(inc<=sf)
     {
         noda=c[inc];
         struct graf *p=l[noda];
         while(p!=NULL)
         {
             if(v[p->nod]==0 && pt[noda][p->nod]>0)
             {
                 t[p->nod]=noda;
                 if(p->nod==dt)//==n?
                 {
                     actualizare(ns,dt);
                     ok=1;
                 }
                 else
                 {
                     sf++;
                     v[p->nod]=1;
                     c[sf]=p->nod;
                 }
             }
             p=p->urm;
         }
         inc++;
     }
     return ok;
}

int main()
{
    f>>n>>m;
    for(int i=1;i<=m;i++)
    {
        f>>a>>b>>x;
        pt[a][b]=x;
        p=new graf;
        p->nod=b;
        p->urm=l[a];
        l[a]=p;

        p=new graf;
        p->nod=a;
        p->urm=l[b];
        l[b]=p;
    }
    while(bfs(1,n))//cat timp exista drum
    {}
    g<<fm;
    return 0;
}