Pagini recente » Cod sursa (job #2943543) | Cod sursa (job #2208774) | Cod sursa (job #788817) | Cod sursa (job #642470) | Cod sursa (job #2960343)
#include <map>
#include <algorithm>
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream in("cuplaj.in");
ofstream out("cuplaj.out");
const int maxn = 1005;
vector <int> v[maxn];
int dist[maxn];
int tata[maxn];
int sursa, destinatie;
map <pair <int, int>, int> flux;
map <pair <int, int>, int> cap;
queue <int> q;
int n;
bool bfs()
{
for(int i = 1; i <= n; i++)
dist[i] = (1 << 30);
dist[sursa] = 0;
q.push(sursa);
while(!q.empty())
{
int nod = q.front();
q.pop();
if(nod == destinatie)
continue;
for(auto it : v[nod])
{
if(dist[it] > dist[nod] + 1 && flux[make_pair(nod, it)] < cap[make_pair(nod, it)])
{
dist[it] = dist[nod] + 1;
tata[it] = nod;
q.push(it);
}
}
}
if(dist[destinatie] == (1 << 30))
return 0;
return 1;
}
vector <pair <int, int> > input;
int main()
{
int m, e;
in >> n >> m >> e;
int ninit = n;
sursa = n + m + 1;
destinatie = n + m + 2;
for(int i = 1; i <= e; i++)
{
int x, y;
in >> x >> y;
v[x].push_back(y + n);
v[y + n].push_back(x);
input.push_back(make_pair(x, y));
cap[make_pair(x, y + n)] = 1;
}
for(int i = 1; i <= n; i++)
{
v[sursa].push_back(i);
v[i].push_back(sursa);
cap[make_pair(sursa, i)] = 1;
}
for(int i = 1; i <= m; i++)
{
v[i + n].push_back(destinatie);
v[destinatie].push_back(i + n);
cap[make_pair(i + n, destinatie)] = 1;
}
n = n + m + 2;
while(bfs())
{
for(auto vec : v[destinatie])
{
if(dist[vec] == (1 << 30) || flux[make_pair(vec, destinatie)] == cap[make_pair(vec, destinatie)])
continue;
tata[destinatie] = vec;
int act = destinatie;
vector <int> drum;
while(tata[act] != 0)
{
drum.push_back(act);
act = tata[act];
}
drum.push_back(act);
reverse(drum.begin(), drum.end());
int topush = (1 << 30);
for(int i = 0; i < drum.size() - 1; i++)
topush = min(topush, cap[make_pair(drum[i], drum[i + 1])] - flux[make_pair(drum[i], drum[i + 1])]);
for(int i = 0; i < drum.size() - 1; i++)
{
flux[make_pair(drum[i], drum[i + 1])] += topush;
flux[make_pair(drum[i + 1], drum[i])] -= topush;
}
}
}
int sol = 0;
for(auto it : v[sursa])
sol = sol + flux[make_pair(sursa, it)];
out << sol << "\n";
for(auto it : input)
if(flux[make_pair(it.first, it.second + ninit)] == 1)
out << it.first << " " << it.second << "\n";
return 0;
}