Pagini recente » Cod sursa (job #2553366) | Cod sursa (job #2526551) | Cod sursa (job #2497493) | Cod sursa (job #2341918) | Cod sursa (job #765520)
Cod sursa(job #765520)
#include <fstream>
#include <vector>
#include <string.h>
#define MAX 1005
#define INF 0x3f3f3f3f
using namespace std;
vector<int> G[MAX];
int viz[MAX], C[MAX][MAX], F[MAX][MAX], queue[MAX], n, m, a, b, c, flow, minflow, TT[MAX];
bool BF()
{
int sNod, fNod;
queue[0] = queue[1] = 1;
memset(viz, 0, MAX * sizeof(int));viz[1] = 1;
for(int i = 1; i <= queue[0]; i++)
{
sNod = queue[i];
for(int j = 0; j < G[sNod].size(); j++)
{
fNod = G[sNod][j];
if(C[sNod][fNod] == F[sNod][fNod] || viz[fNod]) continue;
viz[fNod] = 1; queue[++queue[0]] = fNod;
TT[fNod] = sNod;
}
}
return viz[n];
}
int main()
{
ifstream in("maxflow.in"); in>>n>>m; int nod;
for(;m--;)
{
in>>a>>b>>c;
G[a].push_back(b); G[b].push_back(a);
C[a][b] = c;
} in.close();
for(flow = 0; BF();)
for(int i = 0; i < G[n].size(); i++)
{
nod = G[n][i];
if(F[ nod ][ n ] == C[ nod ][ n ] || !viz[ nod ]) continue;
TT[n] = nod;
minflow = INF;
for(int nod = n; nod != 1; nod = TT[nod])
minflow = min(minflow, C[ TT[ nod ] ][ nod ] - F[ TT[ nod ] ][ nod ]);
if(!minflow) continue;
for(int nod = n; nod != 1; nod = TT[nod])
{
F[ TT[ nod ] ][ nod ] += minflow;
F[ nod ][ TT[ nod ] ] -= minflow;
}
flow += minflow;
}
ofstream out("maxflow.out"); out<<flow; out.close();
return 0;
}