Pagini recente » Cod sursa (job #1401588) | Cod sursa (job #3223839) | Cod sursa (job #2162000) | Cod sursa (job #2129274) | Cod sursa (job #574968)
Cod sursa(job #574968)
#include <fstream>
#include <vector>
#include <queue>
#include <string.h>
#define pb push_back
#define TR(C, i)\
for(i = C.begin(); i != C.end(); i++)
using namespace std;
int N, M;
const int nmax = 1024;
vector<int> G[nmax];
int C[nmax][nmax], E[nmax][nmax];
void read()
{
ifstream in ("maxflow.in");
in >> N >> M;
int i, a, b, c;
for(i = 1; i <= M; i++)
{
in >> a >> b >> c;
G[a].pb( b );
G[b].pb( a );
C[a][b] += c;
}
}
int dist[nmax];
int BFS()
{
queue <int> Q;
Q.push(1);
int nod;
memset(dist, 0, sizeof(dist));
dist[1] = 1;
vector<int>::iterator i;
while(!Q.empty())
{
nod = Q.front();
Q.pop();
if(nod == N)
break;
TR(G[nod],i)
if(C[nod][*i])
{
if(dist[*i] == 0)
{
Q.push(*i);
dist[*i] = dist[nod] + 1;
E[nod][++E[nod][0]] = *i;
}
else if(dist[*i] == dist[nod] + 1)
E[nod][++E[nod][0]] = *i;
}
}
return nod == N;
}
int DF(int nod, int cap)
{
if(cap == 0)
return cap;
if(nod == N)
return cap;
int bag = 0, r, i;
for(i = 1; i <= E[nod][0]; i++)
{
r = DF(E[nod][i], min( cap, C[nod][E[nod][i]] ));
if(r)
{
C[nod][E[nod][i]] -= r;
C[E[nod][i]][nod] += r;
bag += r;
}
}
return bag;
}
int main()
{
read();
int flow, r, i;
for(flow = 0; BFS();)
for(i = 1; i <= E[1][0]; i++)
{
r = DF(E[1][i], C[1][E[1][i]]);
C[1][E[1][i]] -= r;
C[E[1][i]][1] += r;
flow += r;
memset(E, 0, sizeof(E));
}
ofstream out("maxflow.out");
out<< flow << '\n';
return 0;
}