Pagini recente » Cod sursa (job #1003642) | Cod sursa (job #805985) | Cod sursa (job #524235) | Cod sursa (job #1791437) | Cod sursa (job #1108725)
#include <cstdio>
#include <vector>
using namespace std;
#define NMAX 10010
int L, R, E;
int Tiefe;
int DieLange;
int Linke[NMAX];
int Rechts[NMAX];
int Geabraucht[NMAX];
vector < int > G[NMAX];
void Scannen()
{
freopen("cuplaj.in", "r", stdin);
scanf("%d%d%d",&L,&R,&E);
for(int i=1,x,y;i<=E;i++)
{
scanf("%d%d",&x,&y);
G[x].push_back(y);
}
}
bool ZuPaar(int Knoten) // Linke Knoten
{
Geabraucht[Knoten] = Tiefe;
for(vector < int > :: iterator it = G[Knoten].begin(); it != G[Knoten].end(); ++ it) // Rechts Knoten
if(!Linke[*it])
{
Linke[*it] = Knoten;
Rechts[Knoten] = *it;
return true;
}
for(vector < int > :: iterator it = G[Knoten].begin(); it != G[Knoten].end(); ++ it) // Rechts Knoten
if(Geabraucht[Linke[*it]] != Tiefe && ZuPaar(Linke[*it]))
{
Linke[*it] = Knoten;
Rechts[Knoten] = *it;
return true;
}
return false;
}
void Losen()
{
for(bool Veranderung = true; Veranderung;)
{
Veranderung = false;
Tiefe++;
for(int i=1;i<=L;i++)
if(!Rechts[i])
{
bool temp = ZuPaar(i);
if(!Veranderung)
Veranderung = temp;
}
}
}
void Drucken()
{
freopen("cuplaj.out", "w", stdout);
for(int i=1;i<=L;i++)
if(Rechts[i])
DieLange++;
printf("%d\n",DieLange);
for(int i=1;i<=L;i++)
if(Rechts[i])
printf("%d %d\n",i,Rechts[i]);
}
int main()
{
Scannen();
Losen();
Drucken();
return 0;
}