Cod sursa(job #3197516)

Utilizator razvanalexrotaruRazvan Alexandru Rotaru razvanalexrotaru Data 27 ianuarie 2024 04:33:03
Problema Flux maxim de cost minim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.6 kb
#include <bits/stdc++.h>
#define cin fin
#define cout fout
using namespace std;
ifstream cin("fmcm.in");
ofstream cout("fmcm.out");
int a,b,c,cst,n,m,s,d,incoada[408],cap[408][408],cost[408][408],dist[408],tata[408],ok,f[408][408];
vector<int>G[408];
long long BellmanFord()
{
    int i,j;
	for(i=1;i<=n;i++)
	{
		dist[i]=2e9;
		tata[i]=-1;
	}
	dist[s]=0;
	queue<int>Q;
	Q.push(s);
	incoada[s]=1;
	while(!Q.empty())
    {
        int k=Q.front();
        incoada[k]=0;
        Q.pop();
        for(auto j:G[k])
        {
            if(cap[k][j]-f[k][j]>0 && dist[k]+cost[k][j]<dist[j])
            {
                dist[j]=dist[k]+cost[k][j];
                tata[j]=k;
                if(incoada[j]==0)
                {
                    Q.push(j);
                    incoada[j]=1;
                }
            }
        }
    }
    if(dist[d]!=2e9)
    {
        int fluxmin=2e9;
		ok=1;
		for(i=d;i!=s;i=tata[i])
            fluxmin=min(fluxmin,cap[tata[i]][i]-f[tata[i]][i]);
        for(i=d;i!=s;i=tata[i])
		{
			f[tata[i]][i]+=fluxmin;
			f[i][tata[i]]-=fluxmin;
		}
        return fluxmin*dist[d];
    }
    return 0;
}
long long int Flux()
{
	long long int ras=0;
	ok=1;
	while(ok)
	{
		ok=0;
		ras+=BellmanFord();
	}
	return ras;
}
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cin>>n>>m>>s>>d;
    for(int i=1;i<=m;i++)
    {
        cin>>a>>b>>c>>cst;
        G[a].push_back(b);
        G[b].push_back(a);
        cap[a][b]=c;
        cost[a][b]=cst;
        cost[b][a]=-cst;
    }
    cout<<Flux();
    return 0;
}