Pagini recente » Cod sursa (job #2007987) | Istoria paginii runda/oni-2009-xi-xii/clasament | Cod sursa (job #274920) | Monitorul de evaluare | Cod sursa (job #864069)
Cod sursa(job #864069)
//Include
#include <stdio.h>
#include <vector>
#include <algorithm>
#include <string.h>
#include <queue>
using namespace std;
//Definitii
#define pb push_back
//Cosntante
const int sz = 1001;
const int source = 1;
const int oo = (1<<30) - 1;
//Functii
bool bfs();
//Variabile
FILE *in,*out;
bool visited[sz];
int destination, edges,maxFlow;
int father[sz];
int capacity[sz][sz], flow[sz][sz];
vector <int> graph[sz];
//Main
int main(void)
{
in=fopen("maxflow.in","rt");
out=fopen("maxflow.out","wt");
fscanf(in,"%d%d",&destination,&edges);
int rFrom, rTo, rCapacity;
for(int i=1;i<=edges;++i)
{
fscanf(in,"%d%d%d",&rFrom,&rTo,&rCapacity);
graph[rFrom].pb(rTo);
graph[rTo].pb(rFrom);
capacity[rFrom][rTo]=rCapacity;
}
while(bfs())
{
vector <int>::iterator it, end=graph[destination].end();
for(it=graph[destination].begin() ; it!=end; ++it)
{
if(flow[*it][destination] == capacity[*it][destination])
continue;
father[destination] = *it;
int minFlow = oo;
for(int node=destination ; node!=source ; node=father[node])
minFlow = min(minFlow, (capacity[father[node]][node] - flow[father[node]][node]));
for(int node=destination ; node!=source ; node=father[node])
{
flow[father[node]][node] += minFlow;
flow[node][father[node]] -= minFlow;
}
maxFlow += minFlow;
}
}
fprintf(out,"%d\n",maxFlow);
fclose(in);
fclose(out);
return 0;
}
bool bfs()
{
memset(visited,false,sizeof(visited));
visited[source] = true;
queue<int > q;
q.push(source);
vector <int>::iterator it, end;
while(!q.empty())
{
int current = q.front();
q.pop();
if(current == destination)
break;
end = graph[current].end();
for(it=graph[current].begin() ; it!=end ; ++it)
{
if(!visited[*it] && (flow[current][*it] != capacity[current][*it]))
{
visited[*it] = true;
q.push(*it);
father[*it] = current;
}
}
}
return visited[destination];
}
//Ce stil are ->