Pagini recente » Cod sursa (job #555957) | Cod sursa (job #2032963) | Cod sursa (job #228401) | Cod sursa (job #1588698) | Cod sursa (job #2166669)
#include <fstream>
#include <vector>
#include <queue>
#define nmax 1005
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
queue <int> coada;
vector <int> graf[nmax];
int viz[nmax],c[nmax][nmax],oto[nmax],f[nmax][nmax],flux=0,n,m,x,y,val;
int bfs()
{
while(!coada.empty())
coada.pop();
for(int i=1;i<=n;i++)
viz[i]=0;
coada.push(1);
viz[1]=1;
while(!coada.empty())
{
int nod=coada.front();
coada.pop();
int lg=graf[nod].size();
if(nod==n)
continue;
for(int i=0;i<lg;i++)
{
if(c[nod][graf[nod][i]]==f[nod][graf[nod][i]]||viz[graf[nod][i]])
continue;
viz[graf[nod][i]]=1;
oto[graf[nod][i]]=nod;
coada.push(graf[nod][i]);
}
}
return viz[n];
}
int main()
{
fin>>n>>m;
for(int i=1;i<=m;i++)
{
fin>>x>>y>>val;
graf[x].push_back(y);
graf[y].push_back(x);
c[x][y]+=val;
}
while(bfs())
{
int lg=graf[n].size();
for(int i=0;i<lg;i++)
{
if(!viz[graf[n][i]]||c[graf[n][i]][n]==f[graf[n][i]][n])
continue;
oto[n]=graf[n][i];
int mini=100000002;
int nod=n;
while(nod!=1)
{
mini=min(mini,c[oto[nod]][nod]-f[oto[nod]][nod]);
nod=oto[nod];
}
if(mini==0)
continue;
nod=n;
while(nod!=1)
{
f[oto[nod]][nod]+=mini;
f[nod][oto[nod]]-=mini;
nod=oto[nod];
}
flux+=mini;
}
}
fout<<flux;
return 0;
}