Pagini recente » Cod sursa (job #2923774) | Cod sursa (job #312160) | Cod sursa (job #27999) | Cod sursa (job #498282) | Cod sursa (job #404278)
Cod sursa(job #404278)
#include<fstream>
#include<queue>
#include<vector>
#include<bitset>
#include<cstring>
#define max 1024
using namespace std;
int C[max][max];
int F[max][max];
int Father[max];
char viz[max] ;
int N,M;
vector < int > G[max];
int min( int a, int b){ return (a<b?a:b); }
int BFS(){
memset( Father, 0 , sizeof(Father) );
memset( viz, 0, sizeof(viz) );
queue <int > Q;
Q.push(1);
Father[1]=0;
viz[1]=1;
while( !Q.empty() ){
int x = Q.front();
Q.pop();
vector<int>::iterator it;
if(x==N) return 1;
for( it = G[x].begin(); it!=G[x].end(); it++){
if(C[x][*it] == F[x][*it] || viz[*it] ) continue;
viz[*it]=1;
Father[*it] = x;
Q.push(*it);
}
}
return 0;
}
int main(){
ifstream f("maxflow.in");
ofstream g("maxflow.out");
f>>N>>M;
int x,y,c;
while( M-- ){
f>>x>>y>>c;
C[x][y]=c;
G[x].push_back(y);
G[y].push_back(x);
}
int flow=0;
while( BFS() ) {
vector<int>::iterator it;
for( it=G[N].begin(); it!=G[N].end(); it++){
if( C[*it][N] == F[*it][N] || !viz[*it]) continue;
Father[N]=*it;
int minim=0x3f3f3f;
int t;
for( t = N ; t!=1; t = Father[t]) minim = min( minim, C[Father[t]][t] - F[Father[t]][t] );
if (minim==0) continue;
for( t = N ; t!=1; t = Father[t]){ F[Father[t]][t] += minim;
F[t][Father[t]] -=minim;}
flow+=minim;
}
}
g<<flow;
return 0;
}