Pagini recente » Borderou de evaluare (job #1567654) | Cod sursa (job #2548061) | Cod sursa (job #1415118) | Cod sursa (job #2350662) | Cod sursa (job #557771)
Cod sursa(job #557771)
#include<fstream>
#include<vector>
#include<iterator>
#include<queue>
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
# define nmax 1002
#define INF 110002
# define Min(a,b) ((a)<(b)? (a):(b))
int N,M,t[nmax],F[nmax][nmax],cap[nmax][nmax];
vector <int> v[nmax];
queue <int> Q;
void citire()
{
f>>N>>M;
int i,j,c;
for(;M;--M)
f>>i>>j>>c,
v[i].push_back(j),
cap[i][j]=c;
}
int BF(int sursa,int dest)
{
bool viz[nmax];
memset(viz,0,sizeof(viz));
memset(t,0,sizeof(t));
Q.push(sursa); viz[sursa]=1;
int nod;
vector <int>::const_iterator it;
while(!Q.empty())
{
nod=Q.front();
Q.pop();
for(it=v[nod].begin();it<v[nod].end();++it)
if(cap[nod][*it]-F[nod][*it]>0 && !viz[*it])
t[*it]=nod,
Q.push(*it),
viz[*it]=1;
}
if(t[dest])
return 1;
return 0;
}
int edmond_karp(int sursa,int dest)
{
int flux=0,m,i;
while(BF(sursa,dest))
{
m=INF;
for(i=dest;i!=sursa;i=t[i])
m=Min(m,cap[t[i]][i]-F[t[i]][i]);
flux+=m;
for(i=dest;i!=sursa;i=t[i])
F[t[i]][i]+=m;
}
return flux;
}
int main()
{
citire();
g<<edmond_karp(1,N);
}