Pagini recente » Cod sursa (job #1204783) | Cod sursa (job #1410969) | Cod sursa (job #2061680) | Cod sursa (job #1561633) | Cod sursa (job #2076519)
#include<cstdio>
#include<vector>
#include<queue>
#define MAX_N 1000
#define oo 0x3f3f3f3f
using namespace std;
vector<int>G[MAX_N+1];
int c[MAX_N+1][MAX_N+1], f[MAX_N+1][MAX_N+1], T[MAX_N+1], n, m, S, D, maxflow;
bool BFS(int source) {
vector<int>::iterator it;
queue<int>Q;
bool ok = false;
int node, i;
for(i = 1; i <= n; i++)
T[i] = 0;
T[source] = -1;
Q.push(source);
while(!Q.empty()) {
node = Q.front();
Q.pop();
for(it = G[node].begin(); it != G[node].end(); it++)
if(!T[*it] && c[node][*it] > f[node][*it]) {
if(*it != D) {
T[*it] = node;
Q.push(*it);
} else ok = true;
}
}
return ok;
}
void dinic() {
vector<int>::iterator it;
bool drum = BFS(S);
while(drum) {
for(it = G[D].begin(); it != G[D].end(); it++)
if(T[*it] && c[*it][D] > f[*it][D]) {
T[D] = *it;
int minim = oo;
for(int node = D; node != S; node = T[node])
if(minim > c[T[node]][node] - f[T[node]][node])
minim = c[T[node]][node] - f[T[node]][node];
if(minim <= 0) continue;
maxflow += minim;
for(int node = D; node != S; node = T[node]) {
f[T[node]][node] += minim;
f[node][T[node]] -= minim;
}
}
drum = BFS(S);
}
}
int main() {
int x, y, z;
FILE *fin, *fout;
fin = fopen("maxflow.in","r");
fout = fopen("maxflow.out","w");
fscanf(fin,"%d%d",&n,&m);
for(int i = 0; i < m; i++) {
fscanf(fin,"%d%d%d",&x,&y,&z);
G[x].push_back(y);
G[y].push_back(x);
c[x][y] = z;
}
S = 1;
D = n;
dinic();
fprintf(fout,"%d\n",maxflow);
fclose(fin);
fclose(fout);
return 0;
}