Pagini recente » Cod sursa (job #1950994) | Monitorul de evaluare | Cod sursa (job #3322870) | Cod sursa (job #3327726) | Cod sursa (job #3330230)
#include <bits/stdc++.h>
using namespace std;
int n, m;
unordered_map <int, int> cap[20005];
vector <int> v[20005];
int bfs(int s, int t, vector <int> &parent)
{
fill(parent.begin(), parent.end(), -1);
deque <pair<int, int>> q;
q.push_back({s, 1e9});
parent[s] = -2;
while(!q.empty())
{
int nod = q.front().first, flow = q.front().second;
q.pop_front();
for(int i = 0; i < v[nod].size(); i ++)
{
int next = v[nod][i];
int capacity = cap[nod][next];
if(capacity && parent[next] == -1)
{
parent[next] = nod;
int min_flow = min(flow, capacity);
if(next == t)
return min_flow;
q.push_back({next, min_flow});
}
}
}
return 0;
}
int flow(int s, int t)
{
int max_flow = 0, new_flow = 0;
vector <int> parent(n + m + 5);
while(new_flow = bfs(s, t, parent))
{
max_flow += new_flow;
int nod = t;
while(nod != s)
{
int prev = parent[nod];
cap[prev][nod] -= new_flow;
cap[nod][prev] += new_flow;
nod = parent[nod];
}
}
return max_flow;
}
int main()
{
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
int e;
f >> n >> m >> e;
for(int i = 1; i <= e; i ++)
{
int x, y;
f >> x >> y;
v[x].push_back(n + y);
v[n + y].push_back(x);
cap[x][n + y] = 1;
}
for(int i = 1; i <= n; i ++)
cap[0][i] = 1, cap[n + i][n + m + 1] = 1, cap[i][0] = 0, cap[n + m + 1][n + i] = 0,
v[0].push_back(i), v[i].push_back(0),
v[i + n].push_back(n + m + 1), v[n + m + 1].push_back(n + i);
g << flow(0, n + m + 1) << "\n";
for(int i = 1; i <= n; i ++)
{
for(unordered_map<int, int> :: iterator j = cap[i].begin(); j != cap[i].end(); j ++)
{
int nod = j-> first, c = j->second;
if(cap[nod][i] == 1 && nod != 0)
g << i << " " << nod - n << "\n";
}
}
return 0;
}