Pagini recente » Cod sursa (job #2146015) | Cod sursa (job #1392444) | Cod sursa (job #2072835) | Cod sursa (job #141198) | Cod sursa (job #2329856)
#include <stdio.h>
#include <deque>
#include <iostream>
using namespace std;
FILE *in,*out;
int n,m,nr=1,flux;
int start[1002],used[1002],t[1002],c[1002][1002],f[1002][1002];
deque <int> deq;
struct graph {
int node,next;
} v[10002];
void read() {
int k=0,x,y,z;
fscanf(in,"%d %d",&n,&m);
for(int i=1; i<=m; i++) {
fscanf(in,"%d %d %d",&x,&y,&z);
v[++k].node=y;
v[k].next=start[x];
start[x]=k;
v[++k].node=x;
v[k].next=start[y];
start[y]=k;
c[x][y]=z;
}
}
int bfs() {
deq.push_back(1);
while(!deq.empty()) {
int node=deq.front();
deq.pop_front();
for(int vec=start[node]; vec; vec=v[vec].next) {
if(used[v[vec].node]<nr && c[node][v[vec].node]>f[node][v[vec].node]) {
used[v[vec].node]=nr;
t[v[vec].node]=node;
if(v[vec].node!=n)
deq.push_back(v[vec].node);
}
}
}
if(used[n]==nr)
return 1;
return 0;
}
void fluxx() {
for(int k=bfs(); k; k=bfs()) {
for(int i=start[n]; i; i=v[i].next) {
if(used[v[i].node]==nr && c[v[i].node][n]>f[v[i].node][n]) {
t[n]=v[i].node;
int minn=999999999;
for(int j=n; j!=1; j=t[j])
minn=min(minn,c[t[j]][j]-f[t[j]][j]);
if(minn>0) {
for(int j=n; j!=1; j=t[j]) {
f[t[j]][j]+=minn;
f[j][t[j]]-=minn;
}
flux+=minn;
}
}
}
nr++;
}
fprintf(out,"%d",flux);
}
int main() {
in=fopen("maxflow.in","r");
out=fopen("maxflow.out","w");
read();
fluxx();
return 0;
}