Cod sursa(job #469511)

Utilizator ionutz32Ilie Ionut ionutz32 Data 8 iulie 2010 00:13:59
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include <stdio.h>
#include <vector>
#include <queue>
#include <bitset>

using namespace std;

vector<int> graf[355];
vector<int>::iterator u;
int i,n,m,s,d,x,y,c,z,aux,first,difmin[355],cap[355][355],f[355][355],cost[355][355],tt[355];
long long dist[355],sol;
bool k;
struct cmp
{
    inline bool operator()(const int &a,const int &b)const
    {
        return dist[a]>dist[b];
    }
};
priority_queue<int,vector<int>,cmp> heap;
bitset<355> poz;

int main()
{
	freopen("fmcm.in","r",stdin);
	freopen("fmcm.out","w",stdout);
	scanf("%d %d %d %d",&n,&m,&s,&d);
	for (i=1;i<=m;++i)
	{
		scanf("%d %d %d %d",&x,&y,&c,&z);
		graf[x].push_back(y);
		cap[x][y]=c;
		cost[x][y]=z;
		graf[y].push_back(x);
		cost[y][x]=-z;
	}
	k=true;
	while (k)
	{
		k=false;
		dist[1]=1LL*13000*10000000;
		for (i=2;i<=n;++i)
			dist[i]=dist[i-1];
        poz&=0;
		heap.push(s);
		poz.flip(s);
		dist[s]=0;
		difmin[s]=2147000000;
		while (!heap.empty())
		{
			first=heap.top();
			if (first==d)
				k=true;
			poz.flip(first);
			heap.pop();
			for (u=graf[first].begin();u!=graf[first].end();++u)
				if (cap[first][*u]>f[first][*u] && dist[first]+cost[first][*u]<dist[*u])
				{
					if (difmin[first]<cap[first][*u]-f[first][*u])
						difmin[*u]=difmin[first];
					else
						difmin[*u]=cap[first][*u]-f[first][*u];
					dist[*u]=dist[first]+cost[first][*u];
					tt[*u]=first;
					if (!poz.test(*u))
					{
						heap.push(*u);
						poz.flip(*u);
					}
				}
		}
		if (k)
			for (i=d;i!=s;i=tt[i])
			{
				f[tt[i]][i]+=difmin[d];
				f[i][tt[i]]-=difmin[d];
				sol+=difmin[d]*cost[tt[i]][i];
			}
	}
	printf("%lld",sol);
	return 0;
}