Cod sursa(job #2962355)

Utilizator Iordache_AnaIordache Ana-Georgiana Iordache_Ana Data 8 ianuarie 2023 13:42:05
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.67 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
int n,m,e,N,ncur,k,i,nvec,fluxm,mini,j,u,v,d,s;
int viz[20005];
pair<int,int>tata[20005];
vector<vector<pair<pair<int, int>, int>>> l(20005);
int bfs()
{
    queue<int>que;
    que.push(0);
    for(i=0;i<=N;i++)
    {
        tata[i]={-1,-1};
        viz[i]=0;
    }
    viz[0]++;
    while(que.size()!=0)
    {
        ncur = que.front();
        if(ncur == N)
            return 1;
        k=0;
        for(i=0;i<l[ncur].size();i++)
        {
            nvec=l[ncur][i].first.first;
            if(l[ncur][i].first.second>0&&viz[nvec]==0)
            {
                viz[nvec]++;
                tata[nvec]={ncur, k};
                que.push(nvec);
            }
            k++;
        }
        que.pop();
    }
        return 0;
    }

    int Edmonds_Karp()
    {
        fluxm = 0;
        while(bfs())
        {
            for(i=0;i<l[s].size();i++)
            {
                ncur = l[s][i].first.first;
                if(l[ncur][l[s][i].second].first.second > 0 && viz[ncur])
                {
                    mini = INT_MAX;
                    tata[s] = {ncur, l[s][i].second};
                    d = s;
                    while(tata[d].first!=-1)
                    {
                        mini=min(mini, l[tata[d].first][tata[d].second].first.second);
                        d=tata[d].first;
                    }
                    fluxm += mini;
                    d=s;
                    while(tata[d].first!=-1)
                    {
                        l[tata[d].first][tata[d].second].first.second -= mini;
                        l[d][l[tata[d].first][tata[d].second].second].first.second += mini;
                        d=tata[d].first;}}}}
        return fluxm;
    }
    int main()
    {
        f>>n>>m>>e;
        s=n+m+1;
        for(i=0;i<e;i++)
        {
            f>>u>>v;
            l[u].push_back({{v+n,1}, l[v+n].size()});
            l[v+n].push_back({{u, 0}, l[u].size()-1});
        }
        for(i=1;i<=n;i++)
        {
            l[0].push_back({{i, 1}, l[i].size()});
            l[i].push_back({{0, 0}, l[0].size()-1});
        }
        for(i=1;i<=m;i++)
        {
            l[i+n].push_back({{s,1}, l[s].size()});
            l[s].push_back({{i+n,0}, l[i+n].size()-1});
        }
        g<<Edmonds_Karp()<<"\n";
        for(i=1;i<=n;i++)
            for(j=0;j<l[i].size();j++)
            {
                if(l[i][j].first.second!=1&&l[i][j].first.first!=0)
                    g<<i<<" "<<l[i][j].first.first-n<<"\n";
            }
            return 0;
    }