Pagini recente » Cod sursa (job #1259253) | Cod sursa (job #472379) | Cod sursa (job #2287602) | Cod sursa (job #710717) | Cod sursa (job #2462684)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <climits>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
struct edge
{
int d,c;
};
int n,m;
bool vis[1500];
int p[1500];
vector<int> v[1500];
int maxCap[1500][1500];
int usedCap[1500][1500];
int minn[1500];
int sum;
int main()
{
fin>>n>>m;
for(int i=0;i<m;i++)
{
int j,k,c;
fin>>j>>k>>c;
v[j].push_back(k);
v[k].push_back(j);
maxCap[j][k]+=c;
}
while(true)
{
for(int i=1;i<=n;i++)
{
minn[i]=INT_MAX;
vis[i]=false;
}
queue<int> q=queue<int>();
q.push(1);
vis[1]=true;
while(!q.empty())
{
int tp= q.front();
for(vector<int>::iterator it=v[tp].begin(); it!= v[tp].end();++it )
if(!vis[(*it)]&&usedCap[tp][(*it)]<maxCap[tp][(*it)])
{
// cout<<":"<<*it<<" ";
if(*it!=n)
q.push((*it));
vis[*it]=true;
p[*it]=tp;
}
// cout<<"\n"<<tp<<"\n";
q.pop();
}
// cout<<low<<" done\n";
if(vis[n])
{
for(int j=0;j<v[n].size();j++)
{
int currentN= v[n][j];
if(maxCap[currentN][n]==usedCap[currentN][n]|| !vis[currentN]) continue;
int low=INT_MAX;
for(int nod=n;nod!=1;nod=p[nod])
low= min(low,maxCap[p[nod]][nod]-usedCap[p[nod]][nod]);
if(low==0) continue;
sum+=low;
for(int nod=n;nod!=1;nod=p[nod])
{
usedCap[p[nod]][nod]+=low;
usedCap[nod][p[nod]]-=low;
}
}
}
else break;
}
fout<<sum<<"\n";
}