Pagini recente » Cod sursa (job #736844) | Cod sursa (job #1696475) | Cod sursa (job #2566052) | Cod sursa (job #2814940) | Cod sursa (job #2140359)
#include<vector>
#include<cstring>
#include<fstream>
#define INF 10001
using namespace std;
vector<int> graph[INF];
int n,m,e;
int vizitat[INF];///nodurile folosite intr-o iteratie
int match1[INF],match2[INF];///cuplajele realizate - in ambele sensuri
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
int match(int ind)
{
if(vizitat[ind])return 0;///daca a mai fost folosit in interatia curenta, ne intoarcem
vizitat[ind]=1;///il marcam ca fiind folosit
for(vector<int>::iterator it=graph[ind].begin();it!=graph[ind].end();it++)
if(match2[*it]==0)///incercam mai intai sa-l cuplam cu un nod adiacent liber
{
match1[ind]=*it;
match2[*it]=ind;
return 1;///daca reusim, ne intoarcem
}
for(vector<int>::iterator it=graph[ind].begin();it!=graph[ind].end();it++)
if(match(match2[*it]))///inceram a doua oara sa eliberam un nod adiacent ocupat
{
match1[ind]=*it;
match2[*it]=ind;
return 1;///daca reusim sa eliberam un loc, il cuplam cu nodul curent
}
return 0;///daca nu reusim sa-l cuplam
}
int main()
{ ///citire graf
f>>n>>m>>e;
for(int i=1;i<=e;++i)
{ int x,y;
f>>x>>y;
graph[x].push_back(y);
}
int ok=1;
while(ok)///cat timp s-a facut o cuplare in iteratia anterioara => este posibil sa mai putem cupla ceva
{
ok=0;
memset(vizitat,0,sizeof(vizitat));///resetam vizitat
for(int i=1;i<=n;++i)
if(!match1[i]) ok+=match(i);///daca nodul curent nu e cuplat, incercam sa-l cuplam
}
int matches=0;
for(int i=1;i<=n;i++)
if(match1[i])matches++;///numaram cuplajele
g<<matches<<'\n';
for(int i=1;i<=n;i++)
if(match1[i])
g<<i<<' '<<match1[i]<<'\n';///scriem cuplajele
}