Cod sursa(job #2434275)

Utilizator lucian2015blaugranadevil lucian2015 Data 1 iulie 2019 13:34:55
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 kb
#include <fstream>
#include <vector>
#include <queue>
#define nmax 1010
#define inf 0x3f3f3f3f
using namespace std;

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

class graf{
private:
	vector<int> edges[nmax];
	int viz[nmax]={0};
	int nodes=0;
public:
    int c[nmax][nmax]={0};
	graf(int n){
		nodes=n;
	
	}
	void addedge(int x,int y){
		edges[x].push_back(y);
		edges[y].push_back(x);
	}
    bool bfs(int x){
	  queue<int> q;
	  int nod;
	   q.push(x);
	   for (int i=2; i<=nodes; ++i) 
	   	   viz[i]=-1;
	while(!q.empty()){
		nod=q.front();
		q.pop();
	 for(int i=0;i<edges[nod].size();i++)
	 	if(viz[edges[nod][i]]==-1 && c[nod][edges[nod][i]]>0){
	 		if(edges[nod][i]!=nodes)
	 		q.push(edges[nod][i]);
	 		viz[edges[nod][i]]=nod;
	 	}

	}
  return viz[nodes]!=-1;
}
void flowmax(){
	int flow=0, i, nod, l=0;
	 while(bfs(1)){
	 	for(i=0;i<edges[nodes].size();i++){
	 		nod=edges[nodes][i];
	 		  if(viz[nod]==-1 || !c[nod][nodes])
	 		  	continue;
	 		  viz[nodes]=nod;
	 		 int  fmin=inf;
	      for (int i = nodes; viz[i]; i = viz[i]){
				fmin=min(fmin,c[viz[i]][i]);
	      }
			flow += fmin;
			for (int i= nodes; viz[i]; i = viz[i])
			{
				c[viz[i]][i] -= fmin;
				c[i][viz[i]] += fmin;
			}
	 	}

	 }
 	g<<flow;
}
};

int main(){
 int m,  n, x, y, z, i;
 f>>n>>m;
 graf graph(n);
 for(i=1;i<=m;i++){
 	f>>x>>y>>z;
 	graph.addedge(x,y);
 	graph.c[x][y]+=z;

 }
 graph.flowmax();

}