Cod sursa(job #2957644)

Utilizator EduardSanduSandu Eduard Alexandru EduardSandu Data 23 decembrie 2022 11:01:06
Problema Cuplaj maxim in graf bipartit Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.31 kb
#include <bits/stdc++.h>
using namespace std;

ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");

int capacity[21001][21001],n,m,flow,max_flow;
vector<int> visited,parent;
vector<vector<int>> v;

bool bfs()
{
    fill(visited.begin(), visited.end(), 0);
    fill(parent.begin(), parent.end(), 0);

    visited[0] = 1;
    parent[0] = 0;
    queue<int> q;
    q.push(0);

    while(!q.empty())
    {
        int nod = q.front();

        q.pop();

        if(nod == n+m+1)
            return true;

        for(int i=0; i<v[nod].size(); i++)
        {
            if(!visited[v[nod][i]] && capacity[nod][v[nod][i]] > 0)
            {
                q.push(v[nod][i]);
                parent[v[nod][i]] = nod;
                visited[v[nod][i]] = 1;
            }
        }
    }

    return false;


}

int main()
{
    int a,b,c,e;
    fin>>n>>m>>e;
    visited.resize(n+m+2, 0);
    parent.resize(n+m+2, 0);
    v.resize(n+m+2, {});

    for(int i=1; i<=e; i++)
    {
        fin>>b>>c;
        v[b].push_back(c+n);
        capacity[b][c+n] = 1;
        v[c+n].push_back(b);
        v[0].push_back(b);
        v[b].push_back(0);
        capacity[0][b] = 1;
        v[c+n].push_back(n+m+1);
        v[n+m+1].push_back(c+n);
        capacity[c+n][n+m+1] = 1;
    }

    int reusit = bfs();

    while(reusit)
    {
        for(int i=0; i<v[n+m+1].size(); i++)
        {
            if(visited[v[n+m+1][i]])
            {
                parent[n+m+1] = v[n+m+1][i];
                flow = INT_MAX;
                for(int j=n+m+1; j!=0; j=parent[j])
                {
                    flow=min(flow, capacity[parent[j]][j]);
                }
                if(flow != 0)
                {
                    for(int j=n+m+1; j!=0; j=parent[j])
                    {
                        capacity[parent[j]][j] -= flow;
                        capacity[j][parent[j]] += flow;
                    }
                    max_flow += flow;
                }
            }
        }
        reusit = bfs();
    }
    fout<<max_flow<<'\n';

    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=m+1; j++)
        {
            if(capacity[i][j+n] == 0 && capacity[j+n][i] == 1)
                fout<<i<<' '<<j<<'\n';
        }
    }

    return 0;
}