Pagini recente » Cod sursa (job #835059) | Cod sursa (job #2908841) | Cod sursa (job #2049648) | Cod sursa (job #100678) | Cod sursa (job #1676058)
#include <fstream>
#include <string.h>
#include <vector>
#include <queue>
#include <limits.h>
#define nMax 1001
#define pb push_back
#define INF INT_MAX
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int n, m, flow, S, D;
int TT[nMax], viz[nMax];
int C[nMax][nMax];
vector<int> G[nMax];
queue<int> Q;
void read()
{
int a, b, c;
fin>>n>>m;
for(int i=1;i<=m;i++)
{
fin>>a>>b>>c;
G[a].pb(b);
G[b].pb(a);
C[a][b]+=c;
}
}
int bfs()
{
memset(viz, 0, sizeof(viz));
viz[S]=1;
for(Q.push(S);!Q.empty();)
{
int node=Q.front();
Q.pop();
if(node==D)
continue;
for(vector<int>::iterator it=G[node].begin();it!=G[node].end();it++)
{
int fiu=*it;
if(C[node][fiu]==0 || viz[fiu])
continue;
Q.push(fiu);
viz[fiu]=1;
TT[fiu]=node;
}
}
return viz[D];
}
void solve()
{
S=1, D=n;
while(bfs())
{
for(vector<int>::iterator it=G[D].begin();it!=G[D].end();it++)
{
int fiu=*it;
if(C[fiu][D]==0 || viz[fiu]==0)
continue;
TT[D]=fiu;
int Min=INF;
for(int aux=D;aux!=S;aux=TT[aux])
Min=min(Min, C[TT[aux]][aux]);
for(int aux=D;aux!=S;aux=TT[aux])
{
C[TT[aux]][aux]-=Min;
C[aux][TT[aux]]+=Min;
}
flow+=Min;
}
}
}
void write()
{
fout<<flow;
}
int main()
{
read();
solve();
write();
return 0;
}