Cod sursa(job #2680747)

Utilizator robert.barbu27robert barbu robert.barbu27 Data 4 decembrie 2020 11:09:57
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.48 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <vector>
#include <queue>
#define ll long long
#define pb push_back
#define pf push_front
#define nmax 1000
#define inf 1000000000
using namespace std;
int n,m,dest,source,maxflow=0;
vector<int> adj[nmax+5];
int val[1005][1005],tata[1005];


class InParser {
private:
	FILE *fin;
	char *buff;
	int sp;

	char read_ch() {
		++sp;
		if (sp == 4096) {
			sp = 0;
			fread(buff, 1, 4096, fin);
		}
		return buff[sp];
	}

public:
	InParser(const char* nume) {
		fin = fopen(nume, "r");
		buff = new char[4096]();
		sp = 4095;
	}

	InParser& operator >> (int &n) {
		char c;
		while (!isdigit(c = read_ch()) && c != '-');
		int sgn = 1;
		if (c == '-') {
			n = 0;
			sgn = -1;
		} else {
			n = c - '0';
		}
		while (isdigit(c = read_ch())) {
			n = 10 * n + c - '0';
		}
		n *= sgn;
		return *this;
	}

	InParser& operator >> (long long &n) {
		char c;
		n = 0;
		while (!isdigit(c = read_ch()) && c != '-');
		long long sgn = 1;
		if (c == '-') {
			n = 0;
			sgn = -1;
		} else {
			n = c - '0';
		}
		while (isdigit(c = read_ch())) {
			n = 10 * n + c - '0';
		}
		n *= sgn;
		return *this;
	}
};
bool bfs(int node)
{
    vector<bool> d(n+2,0);
    queue<int> q;
    q.push(node);
    d[node]=1;
    tata[node]=-1;
    while(!q.empty())
    {
        int node=q.front();
        if(node==dest) return 1;
        q.pop();
        for(auto x:adj[node])
        {
            if(d[x]==0&&val[node][x]>0)
            {
                d[x]=1;
                q.push(x);
                tata[x]=node;
                if(x==dest) return 1;
            }
        }

    }
    return 0;



}
int flow(int node,int cap)
{
    if(cap==0) return 0;
    while(node!=source)
    {
        if(val[tata[node]][node]<cap)
        {
            cap=val[tata[node]][node];
        }
        node=tata[node];
        if(cap==0) return 0;
    }
    node=dest;
    while(node!=source)
    {
        val[tata[node]][node]-=cap;
        val[node][tata[node]]+=cap;
        node=tata[node];
    }
    return cap;

}
int main()
{
InParser f("maxflow.in");
ofstream g("maxflow.out");
    f>>n>>m;
    dest=n;
    source=1;
    for(int i=1;i<=m;i++)
    {
        int x,y,c;
        f>>x>>y>>c;
        adj[x].pb(y);
        adj[y].pb(x);
        val[x][y]+=c;
    }
    while(bfs(source))
    {
        maxflow+=flow(dest,inf);
    }
    g<<maxflow;


}