Cod sursa(job #2663926)

Utilizator BogdanTicuTicu Bogdan Valeriu BogdanTicu Data 27 octombrie 2020 16:54:41
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.18 kb
#include <bits/stdc++.h>

using namespace std;

ifstream in("maxflow.in");
ofstream out("maxflow.out");

int n,m;
vector<int> graf[1005];
int capacity[1005][1005],flux[1005][1005],previous[1005];
bool viz[1005];
bool bfs()
{
	memset(viz,0,sizeof(viz));
	viz[1]=1;
	queue<int> q;
	q.push(1);
	while(!q.empty())
	{
	//	out<<"A intrat in whileul de la bfs";
		int node=q.front();
		q.pop();
		if(node==n) continue;
		for(auto x:graf[node])
		{
			if(!viz[x] && capacity[node][x]!=flux[node][x])
			{
				previous[x]=node;
				q.push(x);
				viz[x]=1;
			}
		}
	}
	if(viz[n]==0) return 0;
	return 1;
}
int main()
{
	in>>n>>m;
	for(int i=1;i<=m;i++)
	{
		int x,y,c;
		in>>x>>y>>c;
		graf[x].push_back(y);
		graf[y].push_back(x);

		capacity[x][y]+=c;
	}

	int ans=0;

	while(bfs())
	{
		for(auto x:graf[n])
		{
			if(viz[x] && capacity[x][n]!=flux[x][n])
			{
				int minn=1e9;
				previous[n]=x;
				for(int i=n;i>1;i=previous[i])
					minn=min(minn,capacity[previous[i]][i]-flux[previous[i]][i]);
			//	out<<"Minim este egal cu "<<minn<<"\n";				
				for(int i=n;i>1;i=previous[i])
				{
					flux[previous[i]][i]+=minn;
					flux[i][previous[i]]-=minn;
				}
				ans+=minn;
			}
		}
	}
	out<<ans;
	return 0;
}