Pagini recente » Cod sursa (job #914597) | Cod sursa (job #727343) | Cod sursa (job #1420903) | Cod sursa (job #2939720) | Cod sursa (job #727406)
Cod sursa(job #727406)
#include<fstream>
#include<vector>
#include<queue>
#include<algorithm>
#define _NM 5001
#define INF 2147483647
using namespace std;
int nN,nM;
vector<int> vAd[_NM];
int spare[_NM][_NM];
int path_imp();
int main()
{
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
fin>>nN>>nM;
for (int i=1;i<=nM;i++)
{
int nod1,nod2,cap;
fin>>nod1>>nod2>>cap;
spare[nod1][nod2]=cap;
vAd[nod1].push_back(nod2);
vAd[nod2].push_back(nod1);
}
int flow=0;
while(1)
{
int imp=path_imp();
if (imp==0) break;
flow+=imp;
}
fout<<flow;
return 0;
}
int path_imp()
{
queue<int> q; bool in_q[_NM];
for (int i=1;i<=nN;i++) in_q[i]=0;
q.push(1); in_q[1]=1;//source
int prev[_NM]; prev[1]=0;
while (1)
{
if (q.empty()) return 0;
int cur=q.front(); q.pop();
for (vector<int>::iterator it=vAd[cur].begin();it!=vAd[cur].end();++it)
{
if (in_q[*it]||spare[cur][*it]==0) continue;
prev[*it]=cur;
if (*it==nN) //sink
goto endwhile;
q.push(*it); in_q[*it]=1;
}
}
endwhile:
int minflow=INF;
int cur=nN;
while (prev[cur]!=0)
{
minflow=min(minflow, spare[prev[cur]][cur]);
cur=prev[cur];
}
cur=nN;
while (prev[cur]!=0)
{
spare[prev[cur]][cur]-=minflow;
spare[cur][prev[cur]]+=minflow;
cur=prev[cur];
}
return minflow;
}