Pagini recente » Cod sursa (job #1359876) | Cod sursa (job #2689021) | Cod sursa (job #2215440) | Cod sursa (job #384159) | Cod sursa (job #682846)
Cod sursa(job #682846)
#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));
st=0;dr=-1;
push(x);
while (st<=dr)
{
x=pop();
if (x==D)
return;
for (vector<int>::iterator i=a[x].begin();i!=a[x].end();i++)
if (!use[*i] && flux[x][*i]<cost[x][*i])
{
push(*i);
T[*i]=x;
}
}
}
int flow(int S,int D)
{
int add=1,F=0;
while (add)
{
bfs(S,D);
add=inf;
for (int i=D;i!=S;i=T[i])
add=min(add,pump(i));
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;
}