Pagini recente » Cod sursa (job #2582778) | Cod sursa (job #1716267) | Cod sursa (job #1866654) | Cod sursa (job #1812565) | Cod sursa (job #2820603)
#include <bits/stdc++.h>
#define INF 100000000
#define N12 20005
using namespace std;
unordered_map<int, unordered_map<int, int>> flux;
unordered_map<int, unordered_map<int, int>> capacity;
int coada[N12], st, dr, D, dad[N12], N1, N2, m, i, x, y, z, flux_maximal;
bool seen[N12];
vector <int> v[N12];
int ct = 1;
bool BFS()
{
st = 1;
dr = 1;
coada[1] = 0;
memset(seen, false, sizeof(seen));
seen[0] = true;
while(st <= dr)
{
//cout << coada[st] << ": ";
int aux = coada[st];
st ++;
if(aux == D)continue;
for(int i = 0; i < v[aux].size(); i ++)
{
//cout << "In for\n";
int aux1 = v[aux][i];
if(seen[aux1] == true || flux[aux][aux1] == capacity[aux][aux1])continue;
//cout << aux1 << " ";
seen[aux1] = true;
dad[aux1] = aux;
coada[++ dr] = aux1;
}
//cout << "\n";
}
//cout << "\n";
//cout << "Returneaza " << seen[D];
ct ++;
return seen[D];
}
struct edges
{
int x, y;
}vec[100005];
int aux, minn;
int main()
{
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
f >> N1 >> N2 >> m;
D = N1 + N2 + 1; //destination node
for(i = 1; i <= m; i ++)
{
f >> vec[i].x >> vec[i].y;
vec[i].y = vec[i].y + N1;
capacity[vec[i].x][vec[i].y] = 1;
v[vec[i].x].push_back(vec[i].y);
v[vec[i].y].push_back(vec[i].x);
}
for(i = 1; i <= N1; i ++)
{
capacity[0][i] = 1;
v[0].push_back(i);
v[i].push_back(0);
}
for(i = N1 + 1; i <= N1 + N2; i ++)
{
capacity[i][D] = 1;
v[D].push_back(i);
v[i].push_back(D);
}
while(BFS())
{
//cout << "BFS Done\n";
for(i = 0; i < v[D].size(); i ++)
{
int aux1 = v[D][i];
if(flux[aux1][D] == capacity[aux1][D] || seen[aux1] == false)continue;
minn = INF;
dad[D] = aux1;
aux = D;
while(aux != 0)
{
minn = min(minn, capacity[dad[aux]][aux] - flux[dad[aux]][aux]);
aux = dad[aux];
}
if(minn == 0)continue;
aux = D;
while(aux != 0)
{
//cout << aux << " ";
flux[dad[aux]][aux] += minn;
flux[aux][dad[aux]] -= minn;
aux = dad[aux];
}
//cout << "0 " << minn << "\n";
flux_maximal = flux_maximal + minn;
}
}
g << flux_maximal << "\n";
for(i = 1; i <= m; i ++)
if(flux[vec[i].x][vec[i].y])
g << vec[i].x << " " << vec[i].y - N1 << "\n";
return 0;
}