Cod sursa(job #3183194)

Utilizator Ilie_MityIlie Dumitru Ilie_Mity Data 10 decembrie 2023 23:06:27
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.73 kb
// Ilie Dumitru
#include<cstdio>
#include<vector>
#include<bitset>
#include<queue>
const int NMAX=1005, MAXPUSH=110000;

struct edge
{
	int node, left, idxOther;
};

struct state
{
	int node, flow;

	state(int node=0, int flow=MAXPUSH) : node(node), flow(flow) {}
};

int N, M;
std::vector<edge> G[NMAX];
int ans;
std::bitset<NMAX> vis;
int par[NMAX], idxPar[NMAX];

void addEdge(int u, int v, int w)
{
	G[u].push_back({v, w, (int)G[v].size()});
	G[v].push_back({u, 0, (int)G[u].size()-1});
}

void useEdge(edge& e, int flow)
{
	e.left-=flow;
	G[e.node][e.idxOther].left+=flow;
}

void goUp(int node, int flow)
{
	while(par[node]!=-1)
	{
		useEdge(G[par[node]][idxPar[node]], flow);
		node=par[node];
	}
}

int bfs(int source, int target)
{
	int i, nn, fl;
	std::queue<state> q;
	state s;

	q.push(source);
	par[source]=-1;
	vis.reset();
	vis[source]=1;

	do
	{
		s=q.front();
		q.pop();

		if(s.node==target)
		{
			goUp(target, s.flow);
			return s.flow;
		}

		for(i=0;i<(int)G[s.node].size();++i)
		{
			if(!vis[G[s.node][i].node] && G[s.node][i].left)
			{
				nn=G[s.node][i].node;
				fl=std::min(s.flow, G[s.node][i].left);
				par[nn]=s.node;
				idxPar[nn]=i;
				vis[nn]=1;

				q.push(state(nn, fl));
			}
		}
	}while(!q.empty());

	return 0;
}

bool edmondsKarp(int source, int target)
{
	int x=bfs(source, target);

	ans+=x;
	return x;
}

int main()
{
	FILE* f=fopen("maxflow.in", "r"), *g=fopen("maxflow.out", "w");
	int i, a, b, c;

	fscanf(f, "%d%d", &N, &M);
	for(i=0;i<M;++i)
	{
		fscanf(f, "%d%d%d", &a, &b, &c);
		addEdge(a-1, b-1, c);
	}

	while(edmondsKarp(0, N-1));

    fprintf(g, "%d\n", ans);

	fclose(f);
	fclose(g);
	return 0;
}