Cod sursa(job #327433)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 28 iunie 2009 20:53:34
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.77 kb
#include <cstdio>
#include <cstring>
#include <vector>

using namespace std;

#define file_in "fmcm.in"
#define file_out "fmcm.out"

#define Inf 0x3f3f3f3f
#define Nmax 520
#define clear(x,y) memset(x,y,sizeof(x))

int n,m,C[Nmax][Nmax],P[Nmax][Nmax],F[Nmax][Nmax],viz[Nmax*Nmax],dm[Nmax*Nmax],s,d,t[Nmax*Nmax],q[Nmax*Nmax];

void citire()
{
	int x,y,c,f; 
	freopen(file_in,"r",stdin);
	freopen(file_out,"w",stdout);
	
	scanf("%d %d %d %d", &n,&m,&s,&d);
	
	while(m--)
	{
		scanf("%d %d %d %d", &x,&y,&c,&f);
		C[x][y]=c;
		P[x][y]=f;
		P[y][x]=-f;
	}
}

inline int bf()   
{   
     for (int i=1;i<=n;++i)   
          dm[i]=Inf,    
          viz[i]=0;   
     int st=0,dr=1, nod;   
     q[1]=s;   
     dm[s]=0;   
     viz[s]=1;   
     while (st<dr)   
     {   
          nod=q[++st];   
          for (int i=1;i<=n;++i) 
		  if ((dm[nod]+P[nod][i]<dm[i]) && (C[nod][i]-F[nod][i]>0))   
          {   
               dm[i]=dm[nod]+P[nod][i];   
               t[i]=nod;   
               if (!viz[i])   
               {   
                    q[++dr]=i;        
                    viz[i]=1;   
               }   
          }   
          viz[nod]=0;             
     }   
     return (dm[d]<Inf/2);   
}   
	

void solve()
{
	int sol=0;
    while (bf())   
     {   
          int r=C[t[d]][d]-F[t[d]][d];   
          for (int i=d;i!=s;i=t[i])        
               if (C[t[i]][i]-F[t[i]][i]<r)    
                    r=C[t[i]][i]-F[t[i]][i];   
          for (int i=d;i!=s;i=t[i])        
               F[t[i]][i]+=r,   
               F[i][t[i]]-=r;   
         sol+=r*dm[d];   
     }   

     printf("%d", sol);	
}

int main()
{
	citire();
	solve();
		
	fclose(stdin);
	fclose(stdout);
	
	return 0;
}