Mai intai trebuie sa te autentifici.
Cod sursa(job #988927)
Utilizator | Data | 24 august 2013 12:25:48 | |
---|---|---|---|
Problema | Cuplaj maxim in graf bipartit | Scor | 50 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.43 kb |
#include <fstream>
#include <cstring>
#include <vector>
using namespace std;
ifstream F("cuplaj.in");
ofstream G("cuplaj.out");
#define IT(type) vector<type>::iterator
const int Nmax = 10010;
int N,M,E,paired[Nmax],working[Nmax];
int left_pair[Nmax],right_pair[Nmax];
vector<int> V[Nmax];
bool fix(int lnode)
{
if ( lnode == 0 )
return 1;
working[lnode] = 1;
for (IT(int) rnode=V[lnode].begin();rnode!=V[lnode].end();++rnode)
if ( paired[ left_pair[*rnode] ] == 0 && working[ left_pair[*rnode] ] == 0 )
if ( fix( left_pair[*rnode] ) == 1 )
{
left_pair[*rnode] = lnode;
right_pair[lnode] = *rnode;
paired[lnode] = 1;
working[lnode] = 0;
return 1;
}
working[lnode] = 0;
return 0;
}
int main()
{
F>>N>>M>>E;
for (int i=1,x,y;i<=E;++i)
{
F>>x>>y;
V[ x ].push_back( y );
}
bool better = 1;
while ( better )
{
better = 0;
memset(paired,0,sizeof(paired));
for (int i=1;i<=N;++i)
if ( right_pair[i] == 0 )
better |= fix( i );
}
int out = 0;
for (int i=1;i<=N;++i)
if ( right_pair[i] != 0 )
++out;
G<<out<<'\n';
for (int i=1;i<=N;++i)
if ( right_pair[i] != 0 )
G<<i<<' '<<right_pair[i]<<'\n';
}