Cod sursa(job #2701104)

Utilizator darisavuSavu Daria darisavu Data 29 ianuarie 2021 20:44:21
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.63 kb
#include <bits/stdc++.h>
	#define nmax 1005
	using namespace std;
	ifstream f ("maxflow.in");
	ofstream  g ("maxflow.out");
	int n,m,x,y,c,C[nmax][nmax],F[nmax][nmax],t[nmax],FC,s;
	vector <int> v[nmax];

	int bf()
	{
	    int nod,vec,i;
	    queue <int> q;
	    memset(t,0,sizeof(t));
	    t[1]=-1;
	    q.push(1);
	    while(!q.empty())
	    {
	        nod=q.front();
	        if(nod==n) return 1;
	        q.pop();
	        for(i=0; i<v[nod].size(); i++)
	        {
	            vec=v[nod][i];
	            if(!t[vec] && C[nod][vec]!=F[nod][vec])
		     {
	               t[vec]=nod;
	               q.push(vec);
	             }
	         }
	    }
	    return 0;
	}

	void dinic()
	{
	    int j,i,vec;
	    while(bf())
	    {
	        for(i=0; i<v[n].size(); i++)
	        {
	            vec=v[n][i];
	            if(t[vec] && C[vec][n]!=F[vec][n])
	            {
	                FC=C[vec][n]-F[vec][n];
	                for(j=vec; j>1; j=t[j])
	                    FC=min(FC,C[t[j]][j]-F[t[j]][j]);
	                if(FC)
	                {
	                    F[vec][n]+=FC;
	                    F[n][vec]-=FC;
	                    for(j=vec; j>1; j=t[j])
	                    {
	                        F[t[j]][j]+=FC;
	                        F[j][t[j]]-=FC;
	                    }
	                    s+=FC;
	                }
	            }
	        }
	    }
	}
	int main()
	{
	    int i;
	    f>>n>>m;
	    for(i=1; i<=m; i++)
	    {
	        f>>x>>y>>c;
	        v[x].push_back(y);
	        v[y].push_back(x);
	        C[x][y]=c;
	    }
	    dinic();
	    g<<s;
	    return 0;
	}