Pagini recente » Cod sursa (job #2824553) | Cod sursa (job #449268) | Cod sursa (job #2278180) | Cod sursa (job #2490917) | Cod sursa (job #682855)
Cod sursa(job #682855)
#include <fstream>
#include <cstring>
#include <vector>
using namespace std;
const int N=1001,inf=1<<30;
int cost[N][N],flux[N][N],T[N],v[N],st,dr,n;
bool use[N];
vector<int> a[N];
ifstream in("maxflow.in");
ofstream out("maxflow.out");
inline int pump(int x)
{
return cost[T[x]][x]-flux[T[x]][x];
}
inline void push(int x)
{
v[++dr]=x;
}
inline int pop()
{
return v[st++];
}
void bfs(int x,int D)
{
memset(use,false,sizeof(use));
memset(T,0,sizeof(use));
st=0;dr=-1;
push(x);
use[x] = true;
while (st<=dr)
{
x=pop();
for (vector<int>::iterator i=a[x].begin();i!=a[x].end();i++)
if (!use[*i] && flux[x][*i]<cost[x][*i])
{
use[*i] = true;
push(*i);
T[*i]=x;
}
}
}
int flow(int S,int D)
{
int add=1,F=0;
bool ok = true;
while (ok)
{
bfs(S,D);
ok = false;
for (int x=1;x<=n;x++)
if (flux[x][D]<cost[x][D])
{
add=cost[x][D]-flux[x][D];
for (int i=x;i!=S && add > 0;i=T[i])
add=min(add,pump(i));
if (!add) continue;
ok = true;
T[D]=x;
for (int i=D;i!=S;i=T[i])
{
flux[T[i]][i]+=add;
flux[i][T[i]]-=add;
}
F+=add;
}
}
return F;
}
int main()
{
int m,x,y,c;
in>>n>>m;
while (m--)
{
in>>x>>y>>c;
a[x].push_back(y);
a[y].push_back(x);
cost[x][y]=c;
}
out<<flow(1,n)<<"\n";
return 0;
}