Cod sursa(job #250632)

Utilizator bogdanhm999Casu-Pop Bogdan bogdanhm999 Data 31 ianuarie 2009 13:38:23
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
#include <stdio.h>
#include <stdlib.h>
#include <queue>
#include <bitset>
#define N 355
#define M 12005
#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],cap[N][N],cost[N][N];
muchie a[M];
int *v[N];

void bellman(){
 queue<int>Q; bitset<N>iq; int nod;
 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)
      if (cap[nod][v[nod][i]])
        if (d[nod]+cost[nod][v[nod][i]] < d[v[nod][i]]){
          d[v[nod][i]]=d[nod]+cost[nod][v[nod][i]];
          t[v[nod][i]]=nod;
          if (!iq[v[nod][i]]){
             Q.push(v[nod][i]);
             iq[v[nod][i]]=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;
}