Pagini recente » Cod sursa (job #157346) | Cod sursa (job #3132358) | Cod sursa (job #2927394) | Cod sursa (job #2464982) | Cod sursa (job #2754652)
#include <bits/stdc++.h>
#define pb push_back
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
typedef long long ll;
typedef pair<int,int> pi;
int t;
const int dim=1e3+10;
int n,m;
vector < pi > V[dim];
vector < int > viz(dim,0),T(dim,0);
vector < vector < int > > C(dim,vector < int > (dim,0)),F(dim,vector < int >(dim,0));
bool BFS(int s)
{
queue < int > qu;
viz[1]=1;
qu.push(1);
T[1]=-1;
while(!qu.empty())
{
int nod=qu.front();
qu.pop();
viz[nod]=2;
if(nod==n)
return true;
for(int i=0;i<V[nod].size();i++)
{
int vecin=V[nod][i].first;
int cost=V[nod][i].second;
if(!viz[vecin] && C[nod][vecin]>0)
{
T[vecin]=nod;
qu.push(vecin);
viz[vecin]=1;
}
}
}
return false;
}
void init(){
for(int i=1;i<=n;i++)
{
viz[i]=0;
T[i]=-1;
}
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
f>>n>>m;
for(int i=1;i<=m;i++)
{
int a,b,c;
f>>a>>b>>c;
V[a].pb({b,c}); //!!! !!!//
V[b].pb({a,c}); //!!!Am construit graful rezidual virtual pentru o munca mai usoara !!!
C[a][b]=c;
}
while(BFS(1)){
for(pi nod:V[n])
if(viz[nod.first] && C[nod.first][n]>0) //nodul se afla in arborele constuit de BFS
{
T[n]=nod.first;
int minim=INT_MAX;
int tata=n;
while(tata!=1)
{
minim=min(minim,C[T[tata]][tata]);
tata=T[tata];
}
tata=n;
while(tata!=1)
{
C[T[tata]][tata]-=minim;
C[tata][T[tata]]+=minim;
F[T[tata]][tata]+=minim;
F[tata][T[tata]]-=minim;
tata=T[tata];
}
}
init();
}
int ans=0;
for(pi x:V[1])
ans+=F[1][x.first];
g<<ans<<'\n';
return 0;
}