Cod sursa(job #2874852)

Utilizator Danut200333Dumitru Daniel Danut200333 Data 20 martie 2022 12:58:26
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.13 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int n,m;
vector<int> a[1005];
int capacity[1005][1005],flux[1005][1005],t[1005];
bool viz[1005];
bool bfs()
{
	memset(viz,0,sizeof(viz));
	viz[1]=1;
	queue<int> q;
	q.push(1);
	while(!q.empty())
	{
		int nod=q.front();
		q.pop();
		if(nod==n) continue;
		for(int j=0;j<a[nod].size();j++)
		{
		    int x=a[nod][j];
			if(!viz[x] && capacity[nod][x]!=flux[nod][x])
			{
				t[x]=nod;
				q.push(x);
				viz[x]=1;
			}
		}
	}
	if(viz[n]==0) return 0;
	return 1;
}
int main()
{
	fin>>n>>m;
	for(int i=1;i<=m;i++)
	{
		int x,y,c;
		fin>>x>>y>>c;
		a[x].push_back(y);
		a[y].push_back(x);
		capacity[x][y]+=c;
	}
	int sol=0;
	while(bfs())
	{
		for(int j=0;j<a[n].size();j++)
		{
		    int x=a[n][j];
			if(viz[x] && capacity[x][n]!=flux[x][n])
			{
				int cnt=1e9;
				t[n]=x;
				for(int i=n;i>1;i=t[i])cnt=min(cnt,capacity[t[i]][i]-flux[t[i]][i]);
				for(int i=n;i>1;i=t[i])
				{
					flux[t[i]][i]+=cnt;
					flux[i][t[i]]-=cnt;
				}
				sol+=cnt;
			}
		}
	}
	fout<<sol;
	return 0;
}