Pagini recente » Cod sursa (job #1448234) | Cod sursa (job #97820) | Cod sursa (job #2665403) | Cod sursa (job #583152) | Cod sursa (job #661057)
Cod sursa(job #661057)
#include <fstream>
#include <vector>
#include <bitset>
#define nmax 10005
using namespace std;
vector<int> gf[nmax];
int n;//cardinalul primei multimi;
int m;//cardinalul multimii secunde;
int E;//numarul de muchii;
int st[nmax];//st[i] = nodul din partea dreapta cu care e cuplat
int dr[nmax];//dr[i] = nodul din partea stanga cu care e cuplat
bitset<nmax> viz;
int Card_cuplaj;//cardinalul cuplajului
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
void citeste(){
f>>n>>m>>E;
for(int i=1; i<=E; ++i){
int x, y;
f>>x>>y;
gf[x].push_back(y);
}
}
int cupleaza(int nod){
if (viz[nod] == 1) return 0;//daca am mai vizitit acest nod return 0
viz[nod] = 1;//altfel il marchez ca vizitat
for(int i=0; i<gf[nod].size(); ++i){//pentru fiecare vecin al lui nod (din partea dreapta)
int j = gf[nod][i];// j = vecinul lui i;
if (dr[j] == 0 || cupleaza(dr[j]) ){//daca vecinul din multimea din dreapta nu a fost cuplat SAU daca a fost, il mai pot cupla
st[nod] = j;
dr[j] = nod;
return 1;
}
}
return 0;
}
void rezolva(){
for(int ok=1; ok; ){//cat timp exista noduri necuplate
ok = 0;
for(int i=1; i<=n; ++i) viz[i] = 0;
for(int i=1; i<=n; ++i){
if(st[i] == 0 && cupleaza(i)>0 ){//cat timp nodul i nu a fost cuplat si il pot cupla
++Card_cuplaj;
ok = 1;
}
}
}
}
void scrie(){
g<<Card_cuplaj<<"\n";
for(int i=1; i<=n; ++i){//parcurg nodurile primei multimi
if ( st[i] )//daca gasesc un nod cuplat il afisez;
g<<i<<" "<<st[i]<<"\n";
}
}
int main(){
citeste();
rezolva();
scrie();
f.close();
g.close();
return 0;
}