Cod sursa(job #2962283)

Utilizator denisaaabBucur Denisa Andreea denisaaab Data 8 ianuarie 2023 09:02:45
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.3 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");

int n, m, e, mxflow;
int viz[1005];
int tata[1005];
int flux[1005][1005], c[1005][1005];
vector <int> adjlist[1005];
bool modifiedBfs(int finish)
{

    for(int i = 0; i <= 2*n+1; i++)
        viz[i]=0,tata[i]=0;

    int nod=0;
    queue <int> Q;
    Q.push(nod);
    viz[nod] = 1;
    tata[0] = -1;
    while(!Q.empty())
    {
        nod = Q.front();
        Q.pop();
        for(int i=0;i<adjlist[nod].size();i++)
        {
            int vecin=adjlist[nod][i];
            if(viz[vecin]!=1 && c[nod][vecin] - flux[nod][vecin] > 0)
	    {
                viz[vecin] = 1;
                tata[vecin] = nod;
                Q.push(vecin);
            }
        }
    }
    if(!tata[finish])
        return false;
    int start=0;
    for(int i=0;i<adjlist[finish].size();i++)
    {
        int vecin=adjlist[finish][i];
        if(c[vecin][finish] - flux[vecin][finish] > 0)
       {

            int maxFlowLant = c[vecin][finish] - flux[vecin][finish];
            for(int j = vecin; j != start; j = tata[j])
               {
                   maxFlowLant = min(maxFlowLant, c[tata[j]][j] - flux[tata[j]][j]);

               }
            flux[vecin][finish] += maxFlowLant;
            flux[finish][vecin] -= maxFlowLant;
            for(int j = vecin; j != start; j = tata[j]){
                flux[tata[j]][j] += maxFlowLant;
                flux[j][tata[j]] -= maxFlowLant;
            }
            mxflow += maxFlowLant;
        }
    }
    return true;
}
int main()
{
    f>>n>>m>>e;
    int start=0,  finish=n+m+1;
    int x, y;
    for(int i = 1; i <= e; i++)
    {
        f>>x>>y;
        y+=n;
        adjlist[x].push_back(y);
        adjlist[y].push_back(x);
        c[x][y] = 1;
        c[start][x]=1;
	    c[y][finish]=1;
        adjlist[start].push_back(x);
        adjlist[x].push_back(start);

        adjlist[finish].push_back(y);
        adjlist[y].push_back(finish);
    }
    while(modifiedBfs(finish)==true)
    {
          modifiedBfs(finish);
    }
     cout<<mxflow<<endl;
     for(int i=1;i<=n;i++)
        for(int j=n+1;j<=n+m;j++)
            if(flux[i][j]==1)
                cout<<i<<" "<<j-n<<'\n';
    return 0;
}