Pagini recente » Cod sursa (job #101345) | Cod sursa (job #2307901) | Cod sursa (job #2093462) | Cod sursa (job #2462179) | Cod sursa (job #998200)
Cod sursa(job #998200)
#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <string>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <fstream>
#include <iterator>
using namespace std;
const string file = "maxflow";
const string infile = file + ".in";
const string outfile = file + ".out";
const int INF = 0x3f3f3f3f;
int MaxFlow;
int N, M;
vector<vector<int> > Flux;
vector<vector<int> > Cap;
vector<vector<int> > G;
vector<int> prec;
vector<bool> uz;
int S;
int T;
bool bfs(int x)
{
uz.clear();
uz.resize(N + 1);
queue<int> q;
q.push(x);
uz[S] = true;
while(q.empty() == false)
{
int c = q.front();
q.pop();
if ( c == T)
return true;
for(vector<int>::iterator itr = G[c].begin();
itr != G[c].end();
itr++)
{
if(uz[*itr] == true)
continue;
if(Cap[c][*itr] - Flux[c][*itr] > 0)
{
uz[*itr] = true;
q.push(*itr);
prec[*itr] = c;
}
}
}
return false;
}
int main()
{
fstream fin(infile.c_str(), ios::in);
fin >> N >> M;
T = N;
S = 1;
prec.resize(N + 1);
Flux.resize(N + 1, vector<int>(N + 1));
Cap.resize(N + 1, vector<int>(N + 1));
G.resize(N + 1);
for(int i = 0; i < M; i++)
{
int x, y, c;
fin >> x >> y >> c;
G[x].push_back(y);
G[y].push_back(x);
Cap[x][y] = c;
}
fin.close();
while(bfs(1))
{
for(vector<int>::iterator itr = G[T].begin();
itr != G[T].end();
itr++)
{
if(uz[*itr] && Cap[*itr][T] - Flux[*itr][T] > 0)
{
prec[T] = *itr;
int minflow = INF;
for(int n = T; n != 1; n = prec[n])
{
minflow = min(minflow, Cap[prec[n]][n] - Flux[prec[n]][n]);
}
if(minflow == 0)
continue;
MaxFlow += minflow;
for(int n = T; n != 1; n = prec[n])
{
Flux[prec[n]][n] += minflow;
Flux[n][prec[n]] -= minflow;
}
}
}
}
fstream fout(outfile.c_str(), ios::out);
fout << MaxFlow << "\n";
fout.close();
}