Problem: Examples

Input

4 5 2
0 1 2 1
0 2 1 2
1 2 1 1
1 3 1 3
2 3 2 1


Output

6


Input




Output

Solution (in CPP):

Solution:
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const int MAX_V = 100;
const int INF = 1e9;

struct edge
{
	int to,cap,cost,rev;
};

int V;
vector<edge> G[MAX_V];
int dist[MAX_V];
int prevv[MAX_V],preve[MAX_V];

void add_edge(int from,int to, int cap, int cost)
{
	G[from].push_back((edge){to,cap,cost,(int)G[to].size()});
	G[to].push_back((edge){from,0,-cost,(int)G[from].size()-1});
}

int min_cost_frow(int s,int t,int f)
{
	int res = 0;
	while(f>0)
	{
		fill(dist,dist+V,INF);
		dist[s] = 0;
		bool update = true;
		while(update)
		{
			update = false;
			for(int v = 0;v<V;v++)
			{
				if(dist[v] == INF)continue;
				for(int i = 0;i<G[v].size();i++)
				{
					edge &e = G[v][i];
					if(e.cap>0&&dist[e.to]>dist[v] + e.cost)
					{
						dist[e.to] = dist[v]+e.cost;
						prevv[e.to] = v;
						preve[e.to] = i;
						update = true;
					}
				}
			}
		}
		if(dist[t]==INF)
		{
			return -1;
		}
		int d = f;
		for(int v = t;v != s;v = prevv[v])
		{
			d = min(d,G[prevv[v]][preve[v]].cap);
		}
		f -=d;
		res += d*dist[t];
		for(int v= t;v !=s;v=prevv[v])
		{
			edge &e = G[prevv[v]][preve[v]];
			e.cap -= d;
			G[v][e.rev].cap += d;
		}
	}
	return res;
}

int main()
{
	int E,F;
	cin >> V >> E >> F;
	for(int i = 0;i<E;i++)
	{
		int u,v,c,d;
		cin >> u >> v >> c >> d;
		add_edge(u,v,c,d);
	}
	cout<<min_cost_frow(0,V-1,F)<<endl;
}