Cod sursa(job #1955166)

Utilizator DoubleNyNinicu Cristian DoubleNy Data 5 aprilie 2017 20:31:16
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <bits/stdc++.h>
using namespace std; 
 
int n,m,e,k;
int l[10012], r[10123];
bool visited[10123];
int maxFlow;
vector <int> adj[12314];

bool PAIR(int vertex){
        if(visited[vertex])
			return(false);
		visited[vertex] = true;
		for(unsigned i=0; i<adj[vertex].size(); i++){
				if(!r[adj[vertex][i]]){
					r[adj[vertex][i]] = vertex;
					l[vertex] = adj[vertex][i];
					return(1);
				}
		}
		
		for (unsigned i=0; i<adj[vertex].size(); i++){
				if(PAIR(r[adj[vertex][i]])){
					l[vertex] = adj[vertex][i];
					r[adj[vertex][i]] = vertex;
					return(1);
				}
		}
		return(0);
}

void solve(){
		bool lp = 1;
		while(lp){
				lp = 0;
				memset(visited,0,sizeof(visited));
				for(int i=1;i<=n;i++)
					if(!l[i])
						lp|=PAIR(i);
		}
}
 
int main(){
            freopen ("cuplaj.in", "r", stdin);
            freopen ("cuplaj.out", "w", stdout);
            scanf("%d%d%d", &n,&m,&e);
            for(int i = 0; i < e; i++){
                    int x,y;
                    scanf("%d%d", &x, &y);
					adj[x].push_back(y);
            }
			solve();
			int ans = 0;
			for(int i=1;i<=n;i++)	
				if(l[i])
					ans++;
			printf("%d\n", ans);
			for(int i=1;i<=n;i++)
				if(l[i])
					printf("%d %d\n", i, l[i]);
}