Pagini recente » Cod sursa (job #1279528) | Cod sursa (job #3150266) | Cod sursa (job #2194879) | Cod sursa (job #2885557) | Cod sursa (job #1886739)
#include <fstream>
#include <vector>
#include <queue>
#include <bitset>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
const int N=1001;
const int MAX_INF=0x3f3f3f3f;
vector<int>H[N];
vector<int>::iterator it;
bitset<N>viz;
int tata[N],f[N][N],C[N][N],n;
queue<int>Q;
bool bfs()
{
viz[1]=1;
Q.push(1);
while(Q.size())
{
int a=Q.front();
Q.pop();
if(a==n) continue;
for(vector<int>::iterator it=H[a].begin();it!=H[a].end();it++)
{
if(viz[*it]==0&&(C[a][*it]!=f[a][*it]))
{
viz[*it]=1;
tata[*it]=a;
Q.push(*it);
}
}
}
if(viz[n]==1) return 1;
return 0;
}
int main()
{
int m,i,a,b,flux=0,fmin,z;
fin>>n>>m;
for(i=1;i<=m;i++)
{
fin>>a>>b>>z;
C[a][b]=z;
H[a].push_back(b);
H[b].push_back(a);
}
while(bfs())
{
for(it=H[n].begin();it!=H[n].end();it++)
{
if(C[*it][n]!=f[*it][n]&&viz[*it]!=0)
{
fmin=MAX_INF;
tata[n]=*it;
for(i=n;i!=1;i=tata[i])
{
fmin=min(fmin,C[tata[i]][i]-f[tata[i]][i]);
}
if(fmin==0) continue;
flux+=fmin;
for(i=n;i!=1;i=tata[i])
{
f[tata[i]][i]+=fmin;
f[i][tata[i]]-=fmin;
}
}
}
viz.reset();
}
fout<<flux;
}