Pagini recente » Cod sursa (job #155726) | Cod sursa (job #2252614) | Cod sursa (job #1421880) | Cod sursa (job #130533) | Cod sursa (job #1815274)
#include <cstdio>
#include <queue>
#include <vector>
using namespace std;
const int INF=1e9;
struct edge
{
int x,y,cap,flow,inv;
};
vector<edge> muc;
vector<int> v[1010];
int vaz[1010],n,m,tata[1010];
void add_edge(int x,int y,int cap)
{
int a=muc.size();
muc.push_back({x,y,cap,0,a+1});
muc.push_back({x,y,0,0,a});
v[x].push_back(a);
v[y].push_back(a+1);
}
int bfs(int sursa,int dest)
{
for(int i=1;i<=n;i++) vaz[i]=0;
queue<int> q;
q.push(sursa);
vaz[sursa]=1;
while(!q.empty())
{
int nod=q.front();
q.pop();
for(int i=0;i<v[nod].size();i++)
{
int a=v[nod][i];
int vec=muc[a].x^muc[a].y^nod;
if(vaz[vec]==0 && muc[a].flow<muc[a].cap)
{
vaz[vec]=1;
if(vec!=dest) q.push(vec);
tata[vec]=a;
}
}
}
return vaz[dest];
}
int main()
{
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
int x,y,cap,flux=0;
scanf("%d%d",&n,&m);
int dest=n,sursa=1;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&cap);
add_edge(x,y,cap);
}
while(bfs(sursa,dest)>0)
{
for(int i=0;i<v[dest].size();i++)
{
int a=v[dest][i];
int vec=muc[a].x^muc[a].y^dest;
if(vaz[vec]==1 && muc[muc[a].inv].cap>muc[muc[a].inv].flow)
{
tata[dest]=muc[a].inv;
int s=INF;
for(int nod=dest;nod!=sursa;nod=muc[tata[nod]].x^muc[tata[nod]].y^nod)
s=min(s,muc[tata[nod]].cap-muc[tata[nod]].flow);
for(int nod=dest;nod!=sursa;nod=muc[tata[nod]].x^muc[tata[nod]].y^nod)
{
muc[tata[nod]].flow+=s;
muc[muc[tata[nod]].inv].flow-=s;
}
flux+=s;
}
}
}
printf("%d",flux);
return 0;
}