Pagini recente » Cod sursa (job #2075874) | Cod sursa (job #2760614) | Cod sursa (job #983331) | Cod sursa (job #1994470) | Cod sursa (job #1549415)
#include <fstream>
#include <vector>
using namespace std;
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
int N, M, E;
int L[20000];
vector<int> V[20000];
int na;
int C[20000];
bool viz[20000];
int dfs(int i)
{
viz[i] = 1;
for (int j = 1;j<=L[i];++j)
{
int k = V[i][j];
if (viz[k] || C[i] == k) continue;
if (C[k] == -1) { viz[k] = 1; C[k] = i; C[i] = k; return 1; }
else
{
viz[k] = 1;
if (dfs(C[k])) { C[i] = k; C[k] = i; return 1; }
else continue;
}
}
return 0;
}
void set(int X[], int val)
{
for (int i = 0;i < 20000;i++)
X[i] = val;
}
void set(bool X[], int val)
{
for (int i = 0;i < 20000;i++)
X[i] = val;
}
int main()
{
f >> N >> M >> E;
na = N;
N = N + M;
int x, y;
for (int i = 0;i < E;i++)
{
f >> x >> y;
if (V[x].size() == 0) V[x].push_back(0);
if (V[y].size() == 0) V[y].push_back(0);
y += na;
L[x] ++;
L[y] ++;
V[x].push_back(y);
V[y].push_back(x);
}
set(C, -1);//C={-1}
for (int i = 1;i <= na;i++)
{
for (int j = 1;j <= L[i];j++)
if (C[V[i][j]] == -1)
{
C[i] = V[i][j];
C[V[i][j]] = i;
break;
}
}
bool ok = 1;
while (ok)
{
ok = 0;
set(viz, 0);
for (int i = 1;i <= na;i++)
if (!viz[i] && C[i] == -1)
if (dfs(i))
ok = 1;
}
int nr = 0;
for (int i = 1;i <= na;i++)
if (C[i]!=-1) nr++;
g << nr << '\n';
for (int i = 1;i <= na;i++)
if (C[i] != -1)
g << i << " " << C[i]-na << '\n';
return 0;
}