Pagini recente » Cod sursa (job #3203280) | Cod sursa (job #2108760) | Cod sursa (job #1117042) | Cod sursa (job #1921510) | Cod sursa (job #295116)
Cod sursa(job #295116)
#include <stdio.h>
#include <vector>
#include <list>
#define pb push_back
#define mp make_pair
using namespace std;
int n, m, cuplaj;
vector< list<int> > vecini;
vector<bool> sel, sel2;
vector<int> t, nivel;
vector< pair<int, int> > muchii;
void read();
void solve();
void write();
void dfs(int);
int main()
{
read();
solve();
write();
return 0;
}
void dfs(int nod)
{
sel[nod] = 1;
list<int>::iterator i, sfarsit = vecini[nod].end();
for (i = vecini[nod].begin(); i != sfarsit; ++i)
{
if (!sel[*i])
{
t[*i] = nod;
nivel[*i] = nivel[nod] + 1;
dfs(*i);
}
}
if (t[nod] && !sel2[nod] && !sel2[t[nod]])
{
sel2[nod] = sel2[t[nod]] = 1;
int x = nod, y = t[nod];
if (x > n)
{
muchii[++cuplaj] = mp(y, x - n);
}
else
{
muchii[++cuplaj] = mp(x, y - n);
}
}
}
void solve()
{
muchii.reserve(m + n + 1);
cuplaj = 0;
int i;
for (i = 1; i <= n + m; ++i)
{
if (!sel[i])
{
dfs(i);
}
}
}
void write()
{
int i;
FILE *fout = fopen("cuplaj.out", "w");
fprintf(fout, "%d\n", cuplaj);
for (i = 1; i <= cuplaj; ++i)
{
fprintf(fout, "%d %d\n", muchii[i].first, muchii[i].second);
}
fclose(fout);
}
void read()
{
int i, e, x, y;
FILE *fin = fopen("cuplaj.in", "r");
fscanf(fin, "%d%d%d", &n, &m, &e);
vecini.resize(n + m + 1);
sel.resize(n + m + 1, 0);
sel2.resize(n + m + 1, 0);
t.resize(n + m + 1, 0);
nivel.resize(n + m + 1, 1);
for (i = 1; i <= e; ++i)
{
fscanf(fin, "%d%d", &x, &y);
vecini[x].pb(y + n);
vecini[y+n].pb(x);
}
fclose(fin);
}