Cod sursa(job #1167863)

Utilizator radu2004GOLD radu radu2004 Data 6 aprilie 2014 00:13:02
Problema Flux maxim Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <stdio.h>
#include <vector>
#include <deque>
#include <string.h>

using namespace std;
FILE *f,*g;
vector <int> v[1005];
deque <int> q;
int n,m,c1,c[1005][1005],t[1005],i,s,d,min1,flux,fl[1005][1005],i1;
int bf ()
{
    memset (t,0,sizeof (t));
    int nod;
    t[1]=-1;
     q.erase (q.begin (),q.end());
    q.push_back (s);

    while (! q.empty())
    {
        nod=q.front ();
        for (int j=0;j<v[nod].size ();j++)
        {
            int x=v[nod].at (j);
            if (c[nod][x]-fl[nod][x]>0 && t[x]==0)
            {
                q.push_back (x);
                t[x]=nod;
                if (x==d) return 1;
            }
        }
       q.pop_front ();
    }

         return 0;
}
int main()
{f=fopen ("maxflow.in","r");
 g=fopen ("maxflow.out","w");
 fscanf (f,"%d%d",&n,&m);
 int x,y;
 s=1;
 d=n;
 for (i=1;i<=m;i++)
 {
     fscanf (f,"%d%d%d",&x,&y,&c1);
     c[x][y]=c1;
     v[x].push_back(y);
     v[y].push_back (x);
 }

 while (bf())
 {
     for (i1=1;i1<=n;i1++)
         if (c[i1][d]-fl[i1][d]>0 && t[i1]!=0)
     {
     min1=c[i1][d]-fl[i1][d];
     i=i1;
     while (i!=s)
     {
         if (c[t[i]][i]-fl[t[i]][i]<min1) min1 =c[t[i]][i]-fl[t[i]][i];
         i=t[i];
     }
     flux+=min1;
     i=i1;
     fl[i1][d]+=min1;
     fl[i1][d]-=min1;


     while (i!=s)
      {

        fl[t[i]][i]+=min1;
        fl[i][t[i]]-=min1;
        i=t[i];

      }
      }
 }
 fprintf (g,"%d",flux);
    return 0;
}