Pagini recente » Profil balucristian | Istoria paginii utilizator/ptudor2 | Profil Patrunjelu | Istoria paginii utilizator/antonmihaelacamelia | Cod sursa (job #736095)
Cod sursa(job #736095)
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <queue>
#include <string>
using namespace std;
#define nmax 1001
#define inf 0x3f3f3f3f
int n,m,from,to,c,source=1,destination;
bool visit[nmax];
int capacity[nmax][nmax],currentFlow[nmax][nmax],father[nmax];
vector<int> graph[nmax];
bool check();
int main()
{
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
scanf("%i %i", &n,&m);
destination=n;
int i;
for(i=1;i<=m;i++)
{
scanf("%i %i %i", &from,&to,&c);
capacity[from][to]=c;
graph[from].push_back(to);
graph[to].push_back(from);
}
int maxflow=0;
while(check()==true)
{
vector<int>::iterator it;
for(it=graph[destination].begin();it!=graph[destination].end();++it)
{
if(visit[*it] && capacity[*it][destination]!=currentFlow[*it][destination])
{
int node=*it;
int minflow=inf;
father[destination]=node;
for(node=destination;node!=source;node=father[node])
{
minflow=min(minflow,capacity[father[node]][node]-currentFlow[father[node]][node]);
}
if(minflow)
{
for(node=destination;node!=source;node=father[node])
{
currentFlow[father[node]][node]+=minflow;
currentFlow[node][father[node]]-=minflow;
}
maxflow+=minflow;
}
}
}
}
printf("%i\n", maxflow);
//scanf("%i", &i);
return 0;
}
bool check()
{
memset(visit,false,sizeof(visit));
visit[source]=true;
queue<int> Nodes;
Nodes.push(source);
while(!Nodes.empty())
{
int node=Nodes.front();
Nodes.pop();
if(node==destination) break;
vector<int>::iterator it;
for(it=graph[node].begin();it!=graph[node].end();++it)
{
if(visit[*it]==false && currentFlow[node][*it]<capacity[node][*it])
{
visit[*it]=true;
Nodes.push(*it);
father[*it]=node;
}
}
}
return visit[destination];
}