Pagini recente » Cod sursa (job #2244006) | Cod sursa (job #1682571) | Cod sursa (job #1240064) | Cod sursa (job #2521877) | Cod sursa (job #460546)
Cod sursa(job #460546)
#include<cstdio>
#include<vector>
#include<queue>
using namespace std;
class graf
{
int A, B;
int M;
vector<vector<int> > V;
bool cauta_lantalternant(int x, int* cuplat, int *seen, int *prev);
public:
graf(int A, int B, int M);
~graf();
void punemuchie(int a, int b);
vector<int> hopcroftkarp();
};
int main()
{
int A, B, M;
freopen("cuplaj.in", "r", stdin);
freopen("cuplaj.out", "w", stdout);
scanf("%d %d %d", &A, &B, &M);
graf G(A, B, M);
for(;M--;)
{
int a, b;
scanf("%d %d", &a, &b);
a--, b--;
G.punemuchie(a, b);
}
vector<int> sol;
sol = G.hopcroftkarp();
printf("%d\n", sol[0]);
for(int i = 1; i < A + 1; i++)
{
if(sol[i] != -1)
printf("%d %d\n", i, sol[i] + 1 - A);
}
return 0;
}
graf::graf(int A, int B, int M)
{
this->A = A;
this->B = B;
this->M = M;
for(int i = 0; i < A; i++)
V.push_back(*(new vector<int>));
for(int j = A; j < A + B; j++)
V.push_back(*(new vector<int>));
}
graf::~graf()
{
for(int i = 0; i < A + B; i++)
V[i].clear();
V.clear();
}
void graf::punemuchie(int a, int b)
{
V[a].push_back(A + b);
V[A + b].push_back(a);
}
vector<int> graf::hopcroftkarp()
{
int *seen;
seen = new int[A + B];
int *cuplat;
cuplat = new int[A + B];
int *prev;
prev = new int[A + B];
for(int i = 0 ; i < A + B; i++)
cuplat[i] = -1;
while(1)
{
bool ok = false;
for(int i = 0; i < A + B; i++)
seen[i] = 0;
for(int i = 0; i < A; i++)
if(cuplat[i] == -1)
{
ok |= cauta_lantalternant(i, cuplat, seen, prev);
}
if(!ok) break;
}
vector<int> sol;
sol.push_back(0);
for(int i = 0; i < A; i++)
{
sol.push_back(cuplat[i]);
if(cuplat[i] != -1)
sol[0]++;
}
delete seen;
delete cuplat;
delete prev;
return sol;
}
bool graf::cauta_lantalternant(int x, int* cuplat, int *seen, int *prev)
{
queue<int> Q;
Q.push(x);
seen[x] = 1;
int ok = 0;
while(!Q.empty())
{
x = Q.front();
Q.pop();
if(!ok)
{
for(vector<int>::iterator it = V[x].begin(); it != V[x].end(); it++)
if(!seen[*it])
{
Q.push(*it);
prev[*it] = x;
seen[*it] = 1;
if(cuplat[*it] == -1)
{
for(int j = *it; j != -1;)
{
int y;
cuplat[j] = prev[j];
y = cuplat[prev[j]];
cuplat[prev[j]] = j;
j = y;
}
while(!Q.empty()) Q.pop();
return true;
}
}
}
else
{
Q.push(cuplat[x]);
}
ok = !ok;
}
while(!Q.empty()) Q.pop();
return false;
}