Pagini recente » Cod sursa (job #63768) | Cod sursa (job #2290664) | Cod sursa (job #2328366) | Cod sursa (job #2053437) | Cod sursa (job #1636148)
#include <fstream>
#include <algorithm>
#include <queue>
#include <string.h>
#include <vector>
#define nMax 1005
#define INF 1 << 30
#define pb push_back
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
vector<int> G[nMax];
queue<int> Q;
int n, m, C[nMax][nMax], F[nMax][nMax], TT[nMax], sink, source, mflow, viz[nMax];
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;
}
source=1, sink=n;
}
bool dfs()
{
memset(viz, 0, sizeof(viz));
Q.push(source);
viz[source]=1;
while(!Q.empty())
{
int node=Q.front();
Q.pop();
if(node==sink)
continue;
for(vector<int>::iterator it=G[node].begin();it!=G[node].end();it++)
{
if(viz[*it]==1 || C[node][*it]==F[node][*it])
continue;
viz[*it]=1;
TT[*it]=node;
Q.push(*it);
}
}
return viz[sink];
}
void flow()
{
while(dfs())
{
for(vector<int>::iterator it=G[sink].begin();it!=G[sink].end();it++)
{
int node=*it;
if(C[node][sink]==F[node][sink] || !viz[node])
continue;
TT[sink]=node;
int fmin=INF;
for(node=sink;node!=1;node=TT[node])
fmin=min(fmin, C[TT[node]][node]-F[TT[node]][node]);
for(node=sink;node!=1;node=TT[node])
{
F[TT[node]][node]+=fmin;
F[node][TT[node]]-=fmin;
}
mflow+=fmin;
}
}
fout<<mflow;
}
int main()
{
read();
flow();
return 0;
}