Pagini recente » Cod sursa (job #2523850) | Cod sursa (job #2492233) | Cod sursa (job #275821) | Cod sursa (job #1297208) | Cod sursa (job #2921832)
#include <bits/stdc++.h>
using namespace std;
class input {
private:
FILE* fin;
const int sz = 10000;
char* buff, c;
int p;
char read()
{
if (p == sz)
{
fread(buff, 1, sz, fin);
p = 0;
return buff[p++];
}
else
return buff[p++];
}
public:
input(const char* name)
{
c = '-';
buff = new char[sz];
p = sz;
fin = fopen(name, "r");
}
void close()
{
fclose(fin);
}
void open(const char* name)
{
c = '-';
p = sz;
fin = fopen(name, "r");
}
input& operator >> (int& n)
{
c = read();
while (c == ' ' || c == '\n')
c = read();
n = 0;
int sng = 1;
if (c == '-')
sng = -1, c = read();
while (isdigit(c))
n = n * 10 + (c - '0'), c = read();
n *= sng;
return *this;
}
input& operator >> (long long& n)
{
c = read();
while (c == ' ' || c == '\n')
c = read();
n = 0;
int sng = 1;
if (c == '-')
sng = -1, c = read();
while (isdigit(c))
n = n * 10 + (c - '0'), c = read();
n *= sng;
return *this;
}
input& operator >> (char& ch)
{
c = read();
while (c == ' ' || c == '\n')
c = read();
ch = c;
return *this;
}
input& operator >> (string& n)
{
c = read();
while (c == ' ' || c == '\n')
c = read();
n = "";
while (c != ' ' && c != '\n' && c != '\0')
n += c, c = read();
return *this;
}
input& operator >> (double& n)
{
c = read();
while (c == ' ' || c == '\n')
c = read();
n = 0;
while (isdigit(c))
n = n * 10 + (c - '0'), c = read();
if (c != '.')
return *this;
c = read();
double p10 = 10;
while (isdigit(c))
n = n + double(c - '0') / p10, c = read(), p10 *= 10;
return *this;
}
void getline(string& s)
{
s = "";
c = read();
while (c == ' ')
c = read();
while (c != '\n')
s += c, c = read();
}
};
class output {
private:
FILE* fout;
const int sz = 10000;
char* buff;
int p;
void write(char ch)
{
if (p == sz)
{
fwrite(buff, 1, sz, fout);
p = 0;
buff[p++] = ch;
}
else
buff[p++] = ch;
}
public:
output(const char* name)
{
buff = new char[sz];
p = 0;
fout = fopen(name, "w");
}
~output()
{
fwrite(buff, 1, p, fout);
}
output& operator << (int n)
{
if (n < 0)
write('-'), n *= -1;
if (n == 0)
{
write(n + '0');
return *this;
}
if (n / 10 != 0)
*this << (n / 10);
write(('0' + (n % 10)));
return *this;
}
output& operator << (long long n)
{
if (n < 0)
{
write('-');
n *= -1;
}
if (n < 10)
{
write(n + '0');
return *this;
}
*this << (n / 10);
write((n % 10) + '0');
return *this;
}
output& operator << (char c)
{
write(c);
return *this;
}
void precision(double n, int x)
{
*this << int(n);
if (!x)
return;
write('.');
n -= int(n);
n *= 10;
for (int i = 1; i <= x; i++)
{
*this << int(n);
n -= int(n);
n *= 10;
}
}
output& operator << (string n)
{
for (auto i : n)
write(i);
return *this;
}
};
input fin("maxflow.in");
output fout("maxflow.out");
vector <int> g[1001];
int flow[1001][1001], n, m, t[1001], cap[1001];
bitset <1001> f;
int bfs()
{
f.reset();
queue <int> Q;
Q.push(1);
cap[1] = 2000000000;
f[1] = 1;
while (!Q.empty())
{
int nod = Q.front();
Q.pop();
for (auto i : g[nod])
{
if (f[i] || !flow[nod][i])
continue;
f[i] = 1;
cap[i] = min(cap[nod], flow[nod][i]);
t[i] = nod;
if (i == n)
return cap[n];
Q.push(i);
}
}
return 0;
}
int maxFlow()
{
int total = 0;
while (true)
{
int r = bfs();
if (!r)
break;
total += r;
int a, b = n;
while (b != 1)
{
a = t[b];
flow[a][b] -= r;
b = a;
}
}
return total;
}
int main()
{
fin >> n >> m;
for (int i = 1; i <= m; i++)
{
int x, y, c;
fin >> x >> y >> c;
g[x].push_back(y);
g[y].push_back(x);
flow[x][y] = c;
}
fout << maxFlow();
return 0;
}