Cod sursa(job #2627477)

Utilizator loraclorac lorac lorac Data 10 iunie 2020 23:37:03
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.22 kb
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream cin("cuplaj.in");
ofstream cout("cuplaj.out");
const int lim=2e4+5;
struct Op
{
    int nod;int capp;int opus;
};
vector<Op> vec[lim];
pair<int,int> pred[lim];
queue<int> q;
int main()
{
    int n,m,e,a,b;
    cin>>n>>m>>e;
    for(int i=1;i<=e;++i)
    {
        cin>>a>>b;
        int nr1=vec[a].size();
        int nr2=vec[b+n].size();
        vec[a].push_back({b+n,1,nr2});
        vec[b+n].push_back({a,0,nr1});
    }
    for(int i=1;i<=n;++i)
    {
        int nr1=vec[0].size();
        int nr2=vec[i].size();
        vec[0].push_back({i,1,nr2});
        vec[i].push_back({0,0,nr1});
    }
    for(int i=n+1;i<=n+m;++i)
    {
        int nr1=vec[i].size();
        int nr2=vec[n+m+1].size();
        vec[i].push_back({n+m+1,1,nr2});
        vec[n+m+1].push_back({i,0,nr1});
    }
    int flow=0,ads;
    do
    {
        for(int i=1;i<=n+m+1;++i)
            pred[i]={-1,0};
        pred[0]={-2,0};
        q.push(0);
        while(!q.empty())
        {
            int x=q.front();
            q.pop();
            for(int i=0;i<vec[x].size();++i)
            if(pred[vec[x][i].nod].first==-1 and vec[x][i].capp>0)
            {
                pred[vec[x][i].nod]={x,i};
                q.push(vec[x][i].nod);
            }
        }
        if(pred[n+m+1].first!=-1)
        for(int i=n+1;i<=n+m;++i)
        if(pred[i].first!=-1)
        {
            ads=vec[i][vec[n+m+1][i-n-1].opus].capp;
            for(int k=i;pred[k].first>=0;k=pred[k].first)
                ads=min(ads,vec[pred[k].first][pred[k].second].capp);
            if(ads==0) continue;
            vec[i][vec[n+m+1][i-n-1].opus].capp-=ads;
            vec[n+m+1][i-n-1].capp+=ads;
            for(int k=i;pred[k].first>=0;k=pred[k].first)
            {
                vec[pred[k].first][pred[k].second].capp-=ads;
                vec[k][vec[pred[k].first][pred[k].second].opus].capp+=ads;
            }
            flow+=ads;
        }
    }while(pred[n+m+1].first!=-1);
    cout<<flow<<'\n';
    for(int i=1;i<=n;++i)
    for(Op t:vec[i])
    if(t.nod>i and t.capp==0)
        cout<<i<<' '<<t.nod-n<<'\n';
    return 0;
}