Cod sursa(job #622702)

Utilizator valentina506Moraru Valentina valentina506 Data 18 octombrie 2011 13:39:30
Problema Flux maxim de cost minim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include <stdio.h>
#include <stdlib.h>
#include <queue>
#include <bitset>
#define N 355
#define M 12505
#define inf 2147000000
using namespace std;
struct muchie{int x,y;};
int n,m,S,dest,i,x,y,z,w,flux,costflux,minim,aux;
int g[N],d[N],path[N],t[N];
short int cap[N][N],cost[N][N];
muchie a[M];
int *v[N];

void bellman(){
 queue<int>Q; bitset<N>iq; int nod,fiu;
 for (i=1;i<=N;++i)d[i]=inf;
 d[S]=0;
 Q.push(S);iq[S]=1;
 while (!Q.empty()){
    nod=Q.front(); Q.pop();
    iq[nod]=0;
    for (i=0;i<g[nod];++i){
      fiu=v[nod][i];
      if (cap[nod][fiu])
        if (d[nod]+cost[nod][fiu] < d[fiu]){
          d[fiu]=d[nod]+cost[nod][fiu];
          t[fiu]=nod;
          if (!iq[fiu]){ Q.push(fiu); iq[fiu]=1; }
       }
    }
 }
}
int main(){
 freopen("fmcm.in","r",stdin);
 freopen("fmcm.out","w",stdout);
 scanf("%d %d %d %d",&n,&m,&S,&dest);
 for (i=1;i<=m;++i){
	  scanf("%d %d %d %d",&x,&y,&z,&w);
	  g[x]++;g[y]++;
		cap[x][y]=z;
		cost[x][y]=w;
		cost[y][x]=-w;
		a[i].x=x;a[i].y=y;
 }
 for (i=1;i<=n;++i)v[i]=(int*)malloc(g[i]*sizeof(int)),g[i]=0;
 for (i=1;i<=m;++i){
		x=a[i].x;y=a[i].y;
		v[x][g[x]++]=y;
		v[y][g[y]++]=x;
 }
 //////// calculare flux ///////
 
 flux=0;
 do{
	 bellman();
	 if (d[dest]==inf)break;
	 m=0;aux=dest;
	 while (aux!=0){path[++m]=aux;aux=t[aux];}
	 minim=inf;
	 for (i=1;i<m;++i)
			if (cap[path[i+1]][path[i]]<minim) minim=cap[path[i+1]][path[i]];
	 for (i=1;i<m;++i){
			cap[path[i+1]][path[i]]-=minim;
			cap[path[i]][path[i+1]]+=minim;
	 }
	 flux+=minim;
	 costflux+=minim*d[dest];
 }while(1);
 printf("%ld\n",costflux);
 
return 0;
}