Pagini recente » Istoria paginii runda/lot2003-2 | Cod sursa (job #2423682) | Istoria paginii runda/wellcodesimulareclasa10-11martie/clasament | Cod sursa (job #1081219) | Cod sursa (job #1219463)
#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>
#include <bitset>
#define Nmax 1005
#define INF 0x3f3f3f3f
#define x first
#define e second
using namespace std;
struct edge{
int a,b;
int capacity;
int flow;
edge(){
a = b = capacity = flow = 0;
}
edge(int from, int to, int capacity, int flow){
this->a = from;
this->b = to;
this->capacity = capacity;
this->flow = flow;
}
}E[15000];
queue<int> Q;
bitset<Nmax> used;
vector<pair<int,int> > G[Nmax];
int N,M,nr = -1;
int daddy[Nmax];
void Insert(int a,int b,int capacity){
++nr;
E[nr] = edge(a,b,capacity,0);
G[a].push_back(make_pair(b,nr));
}
void read( void )
{
scanf("%d%d",&N,&M);
int a,b,c;
for(int i = 1; i <= M; ++i)
{
scanf("%d%d%d",&a,&b,&c);
Insert(a,b,c);
Insert(b,a,0);
}
}
bool BFS(int k)
{
used = 0;
used[k] = 1;
Q.push(k);
while(!Q.empty()){
k = Q.front(); Q.pop();
if(k == N) continue;
for(vector<pair<int,int> >::iterator it = G[k].begin(); it != G[k].end(); ++it)
if(used[it->x] == false && E[it->e].capacity - E[it->e].flow != 0){
used[it->x] = true;
daddy[it->x] = it->e;
Q.push(it->x);
}
}
return used[N];
}
void FLOW( int k )
{
int minFLOW,maxFLOW = 0;
while(BFS(k))
for(vector<pair<int,int> >::iterator it = G[N].begin(); it != G[N].end(); ++it)
{
if(E[it->e^1].capacity == E[it->e^1].flow)
continue;
daddy[N] = it->e^1;
minFLOW = INF;
for(int nodc = N; nodc != 1; nodc = E[daddy[nodc]].a + E[daddy[nodc]].b - nodc)
minFLOW = min (minFLOW, E[daddy[nodc]].capacity - E[daddy[nodc]].flow);
if(!minFLOW)
continue;
for(int nodc = N; nodc != 1; nodc = E[daddy[nodc]].a + E[daddy[nodc]].b - nodc)
{
E[daddy[nodc]].flow += minFLOW;
E[daddy[nodc]^1].flow -= minFLOW;
}
maxFLOW += minFLOW;
}
printf("%d\n",maxFLOW);
}
int main()
{
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
read();
FLOW(1);
return 0;
}