Cod sursa(job #2961785)

Utilizator VictorB11Badulescu Victor VictorB11 Data 6 ianuarie 2023 23:43:25
Problema Cuplaj maxim in graf bipartit Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 4.89 kb
#include <bits/stdc++.h>
using namespace std;
///ex1-a infoarena maxflow
//ifstream fin("maxflow.in");
//ofstream fout("maxflow.out");
//vector<vector<int>> lista, flux;
//vector<int> viz, tata;
//int n, m;
//bool BFS()
//{
//    int s = 1;
//    int d = n;
//    for(int i = 1; i <= n; i++)
//    {
//        viz[i] = 0;
//        tata[i] = 0;
//    }
//    queue<int> coada;
//    coada.push(s);
//    viz[s] = 1;
//    while(!coada.empty())
//    {
//        int nod = coada.front();
//        coada.pop();
//        for(int& vecin : lista[nod])
//        {
//            if(!viz[vecin] && flux[nod][vecin] > 0)
//            {
//                viz[vecin] = 1;
//                tata[vecin] = nod;
//                coada.push(vecin);
//                if(vecin == d)
//                    return true;
//            }
//        }
//    }
//    return false;
//}
//int minFlow(){
//    int nod = n;
//    int minflux = INT_MAX;
//    while(nod != 1)
//    {
//        minflux = min(minflux, flux[tata[nod]][nod]);
//        nod = tata[nod];
//    }
//    return minflux;
//}
//void ex1a(){
//    fin >> n >> m;
//    lista.resize(n + 1);
//    flux.resize(n + 1, vector<int>(n + 1, 0));
//    viz.resize(n + 1);
//    tata.resize(n + 1);
//    for(int i = 0; i < m; i++)
//    {
//        int x, y, c;
//        fin >> x >> y >> c;
//        lista[x].push_back(y);
//        lista[y].push_back(x);
//        flux[x][y] = c;
//    }
//    int maxflow = 0;
//    while(BFS())
//    {
//        int minflux = minFlow();
//        int nod = n;
//        while(nod != 1)
//        {
//            flux[tata[nod]][nod] -= minflux;
//            flux[nod][tata[nod]] += minflux;
//            nod = tata[nod];
//        }
//        maxflow += minflux;
//    }
//    fout << maxflow;
//}
//void DFS(int nod)
//{
//    viz[nod] = 1;
//    for(int& vecin : lista[nod])
//    {
//        if(!viz[vecin] && flux[nod][vecin] != 0)
//            DFS(vecin);
//    }
//}
//
/////ex1-b taietura minima
//void ex1b(){
//    fin >> n >> m;
//    lista.resize(n + 1);
//    flux.resize(n + 1, vector<int>(n + 1, 0));
//    viz.resize(n + 1);
//    tata.resize(n + 1);
//    for(int i = 0; i < m; i++)
//    {
//        int x, y, c;
//        fin >> x >> y >> c;
//        lista[x].push_back(y);
//        lista[y].push_back(x);
//        flux[x][y] = c;
//    }
//    while(BFS())
//    {
//        int minflux = minFlow();
//        int nod = n;
//        while(nod != 1)
//        {
//            flux[tata[nod]][nod] -= minflux;
//            flux[nod][tata[nod]] += minflux;
//            nod = tata[nod];
//        }
//    }
//    for(int i = 1; i <= n; i++) viz[i] = 0;
//    DFS(1);
//    for(int i = 1; i <= n; i++)
//    {
//        for(int& vecin : lista[i])
//        {
//            if(viz[i] && !viz[vecin])
//                fout << i << " " << vecin << "\n";
//        }
//    }
//}

///ex2-a infoarena cuplaj

ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
vector<vector<int>> lista, flux;
vector<int> viz, tata;
int n1, n2, m, t;
bool BFS()
{
    int s = 1;
    int d = t;
    for(int i = 1; i <= t; i++)
    {
        viz[i] = 0;
        tata[i] = 0;
    }
    queue<int> coada;
    coada.push(s);
    viz[s] = 1;
    while(!coada.empty())
    {
        int nod = coada.front();
        coada.pop();
        for(int& vecin : lista[nod])
        {
            if(!viz[vecin] && flux[nod][vecin] > 0)
            {
                viz[vecin] = 1;
                tata[vecin] = nod;
                coada.push(vecin);
                if(vecin == d)
                    return true;
            }
        }
    }
    return false;
}
int minFlow(){
    int nod = t;
    int minflux = INT_MAX;
    while(nod != 1)
    {
        minflux = min(minflux, flux[tata[nod]][nod]);
        nod = tata[nod];
    }
    return minflux;
}
void ex2(){
    fin>>n1>>n2>>m;
    t = n1 + n2 + 2;
    lista.resize(t + 1);
    flux.resize(t + 1, vector<int>(t + 1, 0));
    viz.resize(t + 1);
    tata.resize(t + 1);
    for(int i = 0; i < m; i++)
    {
        int x, y;
        fin >> x >> y;
        lista[x + 1].push_back(y + n1 +1);
        lista[y + n1 + 1].push_back(x + 1);
        lista[1].push_back(x + 1);
        lista[x + 1].push_back(1);
        lista[y + n1 + 1].push_back(t);
        lista[t].push_back(y + n1 + 1);
        flux[x + 1][y + n1 + 1] = 1;
        flux[1][x + 1] = 1;
        flux[y + n1 + 1][t] = 1;
    }
    int maxflow = 0;
    while(BFS())
    {
        int minflux = minFlow();
        int nod = t;
        while(nod != 1)
        {
            flux[tata[nod]][nod] -= minflux;
            flux[nod][tata[nod]] += minflux;
            nod = tata[nod];
        }
        maxflow += minflux;
    }
    fout << maxflow << "\n";
    for(int i = 2; i <= n1 + 1; i++)
    {
        for(int& vecin : lista[i])
        {
            if(flux[i][vecin] == 0 && vecin != 1)
                fout << i - 1 << " " << vecin - n1 - 1 << "\n";
        }
    }
}

int main() {
    ex2();
    return 0;
}