Pagini recente » algoritmiada-2019/runda-preoji/clasament | Cod sursa (job #1956464) | Cod sursa (job #2154476) | Cod sursa (job #2181921) | Cod sursa (job #954938)
Cod sursa(job #954938)
#include<fstream>
using namespace std;
int N,M;
//vector<int> nr[1010];
int nr[1010][1010],size[1010];
int F[1010][1010],C[1010][1010],tata[1010];
int Q[2000];
int BF()
{
int i;
for(i=0;i<=N;++i)
tata[i]=0;
int p,u,x;
Q[0]=1;
tata[1]=-1;
p=u=0;
while(p<=u)
{
x=Q[p++];
if(x==N)
continue;
for(i=0;i<size[x];++i)
{
if(!tata[nr[x][i]] && F[x][nr[x][i]]<C[x][nr[x][i]])
{
Q[++u]=nr[x][i];
tata[nr[x][i]]=x;
}
}
}
return tata[N];
}
void solve()
{
int i;
while(BF())
{
for(i=0;i<size[N];++i)
{
int nod=nr[N][i];
if(!tata[nod] || F[nod][N]==C[nod][N])
continue;
tata[N]=nod;
int cur=N,max=1000000000;
while(tata[cur]!=-1)
{
if(C[tata[cur]][cur]-F[tata[cur]][cur]<max)
max=C[tata[cur]][cur]-F[tata[cur]][cur];
cur=tata[cur];
}
if(max==1000000000 || !max)
continue;
cur=N;
while(tata[cur]!=-1){
F[tata[cur]][cur]+=max;
F[cur][tata[cur]]-=max;
cur=tata[cur];
}
}
}
}
int main()
{
ifstream in("maxflow.in");
ofstream out("maxflow.out");
int i,x,y,c;
in>>N>>M;
for(i=0;i<M;++i)
{
in>>x>>y>>c;
C[x][y]=c;
nr[x][size[x]]=y; size[x]++;
nr[y][size[y]]=x; size[y]++;
}
solve();
x=0;
for(i=1;i<N;++i)
x+=F[i][N];
out<<x<<'\n';
return 0;
}