Cod sursa(job #2502755)

Utilizator Bogdan_BuzatuBuzatu Bogdan Mihai Bogdan_Buzatu Data 1 decembrie 2019 15:34:16
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.67 kb
#include<fstream>
#include<vector>
#include<queue>
using namespace std;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");

int n,m,e;

vector<int>adj[10010];
int st[10010],dr[10010],dist[10010];
bool bfs(){
	queue<int> Q;

	for (int i=1; i<=n; i++){
		if (st[i]==0){
			dist[i] = 0;
			Q.push(i);
		}
		else{
           dist[i] = 2000000000;
		}
	}

	dist[0] = 2000000000;

	while (!Q.empty()){
		int nod = Q.front();
		Q.pop();
		if (dist[nod] < dist[0]){
			for (int i=0; i<adj[nod].size(); ++i){
				int vecin=adj[nod][i];
				if (dist[dr[vecin]] == 2000000000){
					dist[dr[vecin]] = dist[nod] + 1;
					Q.push(dr[vecin]);
				}
			}
		}
	}
    if(dist[0] != 2000000000){
        return true;
    }
    return false;
}

bool dfs(int nod){
	if (nod!= 0){

		for (int i=0; i<adj[nod].size(); ++i){
            int vecin=adj[nod][i];

			if (dist[dr[vecin]] == dist[nod]+1){

				if (dfs(dr[vecin]) == true){
					dr[vecin] = nod;
					st[nod] = vecin;
					return true;
				}
			}
		}
		dist[nod] = 2000000000;
		return false;
	}
	return true;
}
int hopcroftKarp(){

	for (int i=0; i<n; i++){
        st[i] =0;
	}
	for (int j=0; j<m; j++){
        dr[j]=0;
	}

	int sol = 0;

	while (bfs()){
		for (int i=1; i<=n; i++){
            if (st[i]==0 && dfs(i)){
                sol++;
            }

		}
	}
	return sol;
}

int main(){
    fin>>n>>m>>e;
    for(int i=1;i<=e;i++){
        int x,y;
        fin>>x>>y;
        adj[x].push_back(y);

    }

	fout<<hopcroftKarp()<<"\n";
	for(int i=1;i<=n;i++){
        if(st[i]!=0){
            fout<<i<<" "<<st[i]<<"\n";
        }
	}


	return 0;
}