Pagini recente » Cod sursa (job #1971683) | Cod sursa (job #1056972) | Istoria paginii runda/fmi-no-stress-10/clasament | Cod sursa (job #2096468) | Cod sursa (job #2874223)
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
struct arc{ int j,c; };
int n,m,P[1001],T[1001],C[1001][1001],F[1001][1001],fluxmax;
vector<int> G[1001];
int BF()
{
queue<int> Q;
for(int i=1;i<=n;i++) P[i]=0;
P[1]=1;
Q.push(1);
while(!Q.empty())
{
int i=Q.front();
Q.pop();
if(i!=n)
{
for(auto j:G[i])
if(!P[j] && C[i][j]!=F[i][j])
{
P[j]=1;
Q.push(j);
T[j]=i;
}
}
else return 1;
}
return 0;
}
int main()
{
fin>>n>>m;
for(int i=1;i<=m;i++)
{
int x,y,c;
fin>>x>>y>>c;
G[x].push_back(y);
G[y].push_back(x);
C[x][y]=c;
}
while(BF())
for(auto i:G[n])
if(C[i][n]!=F[i][n] && P[i])
{
T[n]=i;
int fmin=110000;
for(int i=n;i!=1;i=T[i])
fmin=min(fmin,C[T[i]][i]-F[T[i]][i]);
if(fmin>0)
for(int i=n;i!=1;i=T[i])
{
F[T[i]][i]+=fmin;
F[i][T[i]]-=fmin;
}
fluxmax+=fmin;
}
fout<<fluxmax;
return 0;
}