Pagini recente » Cod sursa (job #1294128) | Cod sursa (job #3181240) | Cod sursa (job #551187) | Cod sursa (job #1710010) | Cod sursa (job #1558869)
/*
*/
#include<iostream>
#include<fstream>
#include<vector>
#include <stdio.h>
#include <string.h>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int const Nmax=5003;
vector<pair <int,int> >G[Nmax];
int N,M;
int Use[Nmax];
int Min;
int ok=1,actual,flow,nod_initial;
void read()
{
fin>>N>>M;
int x,y,c;
for(int i=1;i<=M;++i)
{
fin>>x>>y>>c;
G[x].push_back(make_pair(y,c));
}
}
void print()
{
for(int j=1;j<=N;j++)
{
cout<<"liste de adiacenta a lui "<<j<< " :";
for(int i=0;i<(int)G[j].size();i++)
cout<<G[j][i].first<<" "<<G[j][i].second<<" ";
cout<<"\n";
}
}
int dfs(int nod)
{
Use[nod]=1;
if(nod==N)
ok=1;
for(int i=0;i<(int)G[nod].size();i++)
{
int Vecin=G[nod][i].first;
if(G[nod][i].second > 0)
{
if(!Use[Vecin])
{
if(G[nod][i].second<Min)
Min=G[nod][i].second;
dfs(Vecin);
}
if(nod==nod_initial)
{
if(ok==1) //send flow, daca am ajuns la destinatie
{
//am minimu de pe path
for(int i=0;i<(int)G[nod].size();i++)
if(Use[G[nod][i].first])
G[nod][i].second = G[nod][i].second - Min;
flow+=Min;
//cout<<endl<<flow<<endl;
}
memset(Use,0,sizeof(Use));
ok=0;
actual=actual-Min;
Min=actual;
}
}
}
}
int main()
{
read();
// print();
for(int i=0;i<G[1].size();i++)
{
ok=0;
Min=G[1][i].second;
actual=Min;
nod_initial=G[1][i].first;
dfs(G[1][i].first);
}
fout<<flow;
return 0;
}