Cod sursa(job #420238)

Utilizator loginLogin Iustin Anca login Data 18 martie 2010 17:54:09
Problema Flux maxim de cost minim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
# include <fstream>
# include <iostream>
# include <vector>
# include <algorithm>
# define DIM 355
using namespace std;
struct nod{
	int c, z;};
int n, S, D, t[DIM], cost, d[DIM];
nod c[DIM][DIM];

void read ()
{
	int m;
	ifstream fin ("fmcm.in");
	fin>>n>>m>>S>>D;
	int x, y, C, z;
	for (;m--;)
	{
		fin>>x>>y>>C>>z;
		c[x][y].c=C;
		c[x][y].z=z;
		c[y][x].c=0;
		c[y][x].z=-z;
	}
}

struct coada {
	int i;
	coada *next;};

int v[DIM];

int bellman (int kk)
{
	for (int i=1;i<=n;i++)
		d[i]=1000000000, t[i]=-1, v[i]=0;
	coada *st, *dr, *q;
	st=dr=new coada;
	st->i=S;
	st->next=NULL;
	v[S]=1;
	t[S]=0;
	d[S]=0;
	int k;
	while (st)
	{
		q=st;
		k=st->i;
		if (k==D)
			return 1;
				
		v[k]=0;
		for (int i=1;i<=n;i++)
			if (i!=k && c[k][i].c>0 && d[k]+c[k][i].z<d[i])
			{
				d[i]=d[k]+c[k][i].z;
				t[i]=k;
				if(!v[i])
				{
					q=new coada;
					q->i=i;
					q->next=NULL;
					dr->next=q;
					dr=q;
					v[i]=1;
				}
			}
		q=st;
		st=st->next;
		delete q;
		
	}
	return 0;
}

void flux ()
{
	int cmin;
	int kk=0;
	while (bellman(++kk))
	{
		cmin=1000000000;
		for (int i=D;t[i];i=t[i])
			if (cmin>c[t[i]][i].c)
				cmin=c[t[i]][i].c;
		for (int i=D;t[i];i=t[i])
		{
			
			c[t[i]][i].c-=cmin;
			c[i][t[i]].c+=cmin;
		}
		cost+=cmin*d[D];
	}
}
		
int main ()
{
	read ();
	flux();
	ofstream fout ("fmcm.out");
	fout<<cost;
	return 0;
}