Cod sursa(job #2267111)

Utilizator bogdi1bogdan bancuta bogdi1 Data 23 octombrie 2018 11:55:55
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.87 kb
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
vector<int> U[10005];
vector<int> V[10005];
int pair_u[10005];
int pair_v[10005];
int dist[10005];
queue<int> q;
int n;
bool viz[10005];
const int INF = 2000000000;
bool bfs()
{
    int i;
    for(i=1; i<=n; i++)
        if(pair_u[i]==0){
            dist[i]=0;
            q.push(i);
        }
        else
            dist[i]=INF;
    dist[0]=INF;
    while(!q.empty()){
        int u=q.front();
        q.pop();
        if(dist[u]<dist[0]){
            for(i=0; i<U[u].size(); i++){
                int v=U[u][i];
                if(dist[pair_v[v]]==INF){
                    dist[pair_v[v]]=dist[u]+1;
                    q.push(pair_v[v]);
                }
            }
        }
    }
    return dist[0]!=INF;
}
bool dfs(int nod)
{
    if(nod!=0){
        for(int i=0; i<U[nod].size(); i++){
            int v=U[nod][i];
            if(dist[pair_v[v]]==dist[nod]+1)
                if(dfs(pair_v[v])==true){
                    pair_v[v]=nod;
                    pair_u[nod]=v;
                    return true;
                }
        }
        dist[nod]=INF;
        return false;
    }
    return true;
}
int main()
{   freopen("cuplaj.in", "r",stdin);
    freopen("cuplaj.out", "w",stdout);
    int m,e,i,x,y,match;
    scanf("%d%d%d", &n, &m, &e);
    for(i=1; i<=e; i++){
        scanf("%d%d", &x, &y);
        U[x].push_back(y);
        V[y].push_back(x);
    }
    for(i=1; i<=n; i++)
        pair_u[i]=0;
    for(i=1; i<=m; i++)
        pair_v[i]=0;
    match=0;
    while(bfs()==true)
        for(i=1; i<=n; i++)
            if(pair_u[i]==0)
                if(dfs(i)==true)
                    match++;
    printf("%d\n", match);
    for(i=1; i<=n; i++)
        if(pair_u[i]!=0)
            printf("%d %d\n", i, pair_u[i]);
    return 0;
}