Pagini recente » Cod sursa (job #2976145) | Cod sursa (job #2830005) | Cod sursa (job #1909487) | Cod sursa (job #1687812) | Cod sursa (job #1144352)
#include <fstream>
#include <queue>
#include <vector>
#include <cstring>
#define oo 0x3f3f3f3f
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
vector<int>g[1001];
bool vis[1001];
queue<int>q;
int t[1001], F[1001][1001], c[1001][1001], n, m, x, y, cap, res;
inline bool Bfs()
{
memset(vis,0,sizeof(vis));
vis[1]=1;
q.push(1);
while(!q.empty())
{
int x=q.front(); q.pop();
if(x==n) continue;
for(vector<int>::iterator it=g[x].begin(); it<g[x].end(); it++ )
{
if(!vis[*it] && F[x][*it]<c[x][*it])
{
vis[*it]=1;
q.push(*it);
t[*it]=x;
}
}
}
return vis[n];
}
int main()
{
fin>>n>>m;
for(int i = 1; i<= m; i++ )
{
fin>>x>>y>>cap;
c[x][y]=cap;
g[x].push_back(y);
g[y].push_back(x);
}
while(Bfs())
{
for(vector<int>::iterator it=g[n].begin(); it<g[n].end(); it++ )
{
if(F[*it][n]<c[*it][n]&&vis[*it])
{
t[n]=*it;
int flux=oo;
for(int i =n; i!=1; i=t[i])
flux=min(flux,c[t[i]][i]-F[t[i]][i]);
if(flux==0)
continue;
for(int i = n; i!=1; i=t[i])
{
F[t[i]][i]+=flux;
F[i][t[i]]-=flux;
}
res+=flux;
}
}
}
fout<<res;
fin.close();
fout.close();
return 0;
}