Pagini recente » Borderou de evaluare (job #123666) | Borderou de evaluare (job #1672924) | Borderou de evaluare (job #2647190) | Borderou de evaluare (job #327580) | Cod sursa (job #981403)
Cod sursa(job #981403)
#include <fstream>
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
vector <int> G[10001];
int l[10001],r[10001];
int n1,n2,m,a,b;
bool ok,v[10001];
bool find_augmenting_path (int node)
{
if (v[node]) return 0;
v[node]=1;
for (vector<int>::iterator it=G[node].begin(); it!=G[node].end(); ++it)
{
if (!r[*it])
{
l[node]=*it;
r[*it]=node;
return 1;
}
}
for (vector<int>::iterator it=G[node].begin(); it!=G[node].end(); ++it)
{
if (find_augmenting_path(r[*it]))
{
l[node]=*it;
r[*it]=node;
return 1;
}
}
return 0;
}
int main ()
{
fin>>n1>>n2>>m;
for (int i=1; i<=m; i++)
{
fin>>a>>b;
G[a].push_back(b);
}
int matching=0;
do
{
ok=0;
memset (v,0,n1+1);
for (int i=1; i<=n1; i++) if (!l[i])
if (find_augmenting_path (i))
{
ok=1;
matching++;
}
} while (ok);
fout<<matching<<"\n";
for (int i=1; i<=n1; i++)
{
if (l[i]>0)
{
fout<<i<<" "<<l[i]<<"\n";
}
}
return 0;
}