Pagini recente » Profil StarGold2 | Cod sursa (job #2297652) | Cod sursa (job #2085989) | Cod sursa (job #1556550) | Cod sursa (job #1027425)
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
int F[1005][1005];
int C[1005][1005];
int N,M,p[1005];
queue<int> q;
vector<int> G[1005];
bool is_path()
{
memset(p,0,sizeof(p));
q.push(1);p[1]=-1;
while(!q.empty())
{
if(q.front()==N)
{
q.pop();
continue;
}
for(vector<int>::iterator it=G[q.front()].begin();it!=G[q.front()].end();it++)
if(!p[*it] && F[q.front()][*it]<C[q.front()][*it])
{
q.push(*it);
p[*it]=q.front();
}
q.pop();
}
if(!p[N])
return false;
return true;
}
int main()
{
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
scanf("%d%d",&N,&M);
for(int x,y,c,i=1;i<=M;i++)
{
scanf("%d%d%d",&x,&y,&c);
C[x][y]=c;
G[x].push_back(y);
G[y].push_back(x);
}
int total=0;
while(is_path())
for(vector<int>::iterator it=G[N].begin();it!=G[N].end();it++)
if(F[*it][N]<C[*it][N] && p[*it])
{
int u=*it,flux=C[*it][N]-F[*it][N];
while(u!=1)
{
flux=min(flux,C[p[u]][u]-F[p[u]][u]);
u=p[u];
}
u=*it;
F[*it][N]+=flux;
F[N][*it]-=flux;
while(u!=1)
{
F[p[u]][u]+=flux;
F[u][p[u]]-=flux;
u=p[u];
}
total+=flux;
}
printf("%d\n",total);
return 0;
}