Pagini recente » Istoria paginii preoni-2007/runda-3 | preONI 2007 | Rating Vilcu Rares Andrei (RaresVilcu) | Cod sursa (job #215247) | Cod sursa (job #3299850)
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int capacitate[1024][1024]; ///capacitatea maxima dintre doua noduri
int flux[1024][1024]; ///fluxul dintre doua noduri
int prec[1024]; ///precursor pentru a retine drumul parcurs de la start la finish
vector<int> mat[1024]; ///matricea de adiacenta
int n,m;
bool bfs()
{
bool f[1024]={0};
queue<int>Q;
Q.push(1);
while(Q.empty()!=1)
{
int nod=Q.front();
for(vector<int>::iterator it=mat[nod].begin() ; it!=mat[nod].end(); it++)
{
if (capacitate[nod][(*it)]==flux[nod][(*it)] || f[(*it)]==1) /// daca avem flux maxim intre noduri sau am trecut prin acest nod
continue; /// nu mai trec
f[(*it)]=1; /// imi notez ca am vizitat nodul
prec[(*it)]=nod;
Q.push((*it));
if ((*it)==n) ///daca am ajuns in capat m am oprit
return 1;
}
Q.pop();
}
return 0; ///nu am putut ajunge in capat
}
int main()
{
int fluxmax=0,fmin,a,b,cap;
cin>>n>>m;
for(int i=0; i<m; i++)
{
cin>>a>>b>>cap;
capacitate[a][b]+=cap;
mat[a].push_back(b);
mat[b].push_back(a);
}
while(bfs()==1)
{
fmin = 2000000000;
int i=n;
while(i!=1)
{
fmin=min(fmin, capacitate[prec[i]][i]- flux[prec[i]][i]);
i=prec[i];
}
i=n;
while(i!=1)
{
flux[prec[i]][i]+=fmin;
flux[i][prec[i]]-=fmin;
i=prec[i];
}
fluxmax+=fmin;
}
cout<<fluxmax;
return 0;
}