Pagini recente » Cod sursa (job #668342) | Cod sursa (job #1731450) | Cod sursa (job #688667) | Cod sursa (job #70669) | Cod sursa (job #379735)
Cod sursa(job #379735)
#include <fstream>
#include <vector>
using namespace std;
const int maxn = 201;
void citire(vector<int> G[], int &N, int &M)
{
int E;
ifstream in("cuplaj.in");
in >> N >> M >> E;
int x, y;
for ( int i = 1; i <= E; ++i )
{
in >> x >> y;
G[x].push_back(y);
}
in.close();
}
bool Cuplare(vector<int> G[], int i, int St[], int Dr[], bool V[])
{
if ( V[i] )
return 0;
V[i] = 1;
vector<int>::iterator v;
for ( v = G[i].begin(); v != G[i].end(); ++v )
if ( !St[*v] )
{
St[*v] = i;
Dr[i] = *v;
return 1;
}
for ( v = G[i].begin(); v != G[i].end(); ++v )
if ( Cuplare(G, St[*v], St, Dr, V) )
{
St[*v] = i;
Dr[i] = *v;
return 1;
}
return 0;
}
void CuplajMax(vector<int> G[], int N)
{
int St[maxn], Dr[maxn];
bool V[maxn], ok = 1;
for ( int i = 1; i < maxn; ++i )
St[i] = Dr[i] = 0;
do
{
ok = 0;
for ( int i = 1; i <= N; ++i )
V[i] = 0;
for ( int i = 1; i <= N; ++i )
if ( !Dr[i] )
ok |= Cuplare(G, i, St, Dr, V);
} while ( ok );
ofstream out("cuplaj.out");
for ( int i = 1; i <= N; ++i )
if ( Dr[i] )
out << i << ' ' << Dr[i] << '\n';
out.close();
}
int main()
{
int N, M;
vector<int> G[maxn];
citire(G, N, M);
CuplajMax(G, N);
return 0;
}