Pagini recente » Cod sursa (job #352507) | Cod sursa (job #2856136) | Cod sursa (job #2897898) | Cod sursa (job #2962730) | Cod sursa (job #2098752)
#include <bits/stdc++.h>
using namespace std;
ifstream f("joc4.in");
ofstream g("joc4.out");
const int MaxN = 253;
int n, m, from[2 * MaxN], s, d;
char flow[2 * MaxN][2 * MaxN], cap[2 * MaxN][2 * MaxN];
vector<int> gr[2 * MaxN];
queue<int> q;
bool viz[2 * MaxN];
bool bfs()
{
memset(viz, 0, sizeof(viz));
memset(from, 0, sizeof(from));
while (!q.empty()) q.pop();
q.push(s);
viz[s] = 1;
viz[s - 1] = 1;
while (!q.empty() && !viz[d])
{
int node = q.front();
for (auto son: gr[node])
{
if (!viz[son] && flow[node][son] < cap[node][son])
{
viz[son] = 1;
from[son] = node;
q.push(son);
}
}
q.pop();
}
return viz[d];
}
int main()
{
f >> n >> m >> s >> d;
for (int i = 1; i <= n; ++i)
{
cap[2 * i][2 * i + 1] = 1;
gr[2 * i].push_back(2 * i + 1);
gr[2 * i + 1].push_back(2 * i);
}
for (int i = 1; i <= m; ++i)
{
int x, y;
f >> x >> y;
cap[2 * x + 1][2 * y] = 1;
cap[2 * y + 1][2 * x] = 1;
gr[2 * x + 1].push_back(2 * y);
gr[2 * y].push_back(2 * x + 1);
gr[2 * y + 1].push_back(2 * x);
gr[2 * x].push_back(2 * y + 1);
}
s = 2 * s + 1;
d = 2 * d;
gr[d].clear();
gr[s - 1].clear();
int ans = 0;
while (bfs())
{
for (int i = 1; i <= 2 * n + 1; ++i)
if (i != d && (from[i] || i == s) && flow[i][d] < cap[i][d])
{
int mini = 100000;
from[s] = 0;
from[d] = i;
int node = d;
while (from[node])
{
mini = min(mini, cap[from[node]][node] - flow[from[node]][node]);
node = from[node];
}
node = d;
while (from[node])
{
flow[from[node]][node] += mini;
flow[node][from[node]] -= mini;
node = from[node];
}
ans += mini;
}
}
g << ans << '\n';
return 0;
}