Pagini recente » Cod sursa (job #2795855) | Cod sursa (job #1240817) | Cod sursa (job #2721948) | Cod sursa (job #2851641) | Cod sursa (job #333971)
Cod sursa(job #333971)
#include <fstream>
#include <queue>
#define INF INT_MAX
using namespace std;
struct node {
int vertex,from;
};
node nodez (int a, int c) {
node my;
my.vertex=a;
my.from=c;
return (my);
}
node mynod;
queue<node> q;
int N,M,from[1010],visit[1010],capacity[1010][1010],a,b,i,c;
vector<int> vecin[1010];
vector<int>::iterator it;
bool BFS(){
memset(visit, 0, sizeof(visit));
int where;
q.push(nodez(1,-1));
while (!q.empty()) {
mynod=q.front();
q.pop();
where=mynod.vertex;
if (visit[where]) continue;
from[where]=mynod.from;
if (where==N) {visit[N]=1; continue;}
visit[where]=1;
for (it=vecin[where].begin();it!=vecin[where].end();it++) {
if (capacity[where][*it]>0) q.push(nodez(*it,where));
}
}
return visit[N];
}
int main () {
ifstream in;
ofstream out;
in.open("maxflow.in");
out.open("maxflow.out");
in >> N >> M;
for (i=0;i<M;i++) {
in >> a >> b >> c;
vecin[a].push_back(b);
vecin[b].push_back(a);
capacity[a][b]=c;
}
int sum=0,m=INF,nod;
for(m=0;BFS();)
for (it=vecin[N].begin();it!=vecin[N].end();it++) {
nod=*it;
if (capacity[nod][N]==0||from[nod]==0) continue;
from[N]=nod;
m=INF;
nod=N;
while (from[nod]>0) {
m=min(m,capacity[from[nod]][nod]);
nod=from[nod];
}
if (!m) continue;
nod=N;
while (from[nod]>0) {
capacity[from[nod]][nod]-=m;
capacity[nod][from[nod]]+=m;
nod=from[nod];
}
sum+=m;
}
out << sum;
out.close();
return 0;
}