Cod sursa(job #2681143)

Utilizator etienAndrone Stefan etien Data 5 decembrie 2020 01:35:46
Problema Cuplaj maxim in graf bipartit Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.15 kb
#include<bits/stdc++.h>
using namespace std;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
vector<int>v[20002];
queue<int>q;
bool viz[20002];
int t[20002],part[20002];
bool flow[20002][20002];
int nr,tot;
int w[20002];
vector<pair<int,int>>rez;
void adauga(int nod)
{
    if(nod==0)
        w[++nr]=0;
    else
    {
        adauga(t[nod]);
        w[++nr]=nod;
    }
}
void bfs()
{
    q.push(0);
    viz[0]=true;
    while(!q.empty())
    {
        int nod=q.front();
        q.pop();
        for(auto x:v[nod])
            if(!viz[x]&&flow[nod][x])
            {
                t[x]=nod;
                q.push(x);
                viz[x]=true;
            }
    }
}
int main()
{
    int n,m,e;
    fin>>n>>m>>e;
    for(int i=1;i<=e;i++)
    {
        int a,b;
        fin>>a>>b;
        b=b+n;
        flow[a][b]=1;
        part[a]=1;
        part[b]=2;
        v[a].push_back(b);
        v[b].push_back(a);
    }
    for(int i=1;i<=n+m;i++)
        if(part[i]==1)
        {
            v[i].push_back(0);
            v[0].push_back(i);
            flow[0][i]=1;
        }
        else
        {
            v[i].push_back(n+m+1);
            v[n+m+1].push_back(i);
            flow[i][n+m+1]=1;
        }
    n=n+m+1;
    bfs();
    while(viz[n])
    {
        for(auto q:v[n])
        {
            adauga(q);
            w[++nr]=n;
            fill(viz,viz+20001,0);
            int cmin=1000001;
            for(int i=1;i+1<=nr;i++)
            {
                int a=w[i];
                int b=w[i+1];
                if(cmin>flow[a][b])
                    cmin=flow[a][b];
            }
            for(int i=1;i+1<=nr;i++)
            {
                int a=w[i];
                int b=w[i+1];
                flow[a][b]-=cmin;
                flow[b][a]+=cmin;
            }
            tot+=cmin;
            nr=0;
        }
        bfs();
    }
    fout<<tot<<"\n";
    n-=m+1;
    for(int i=1;i<=n;i++)
        for(auto q:v[i])
            if(q!=0)
                if(flow[i][q]!=1)
                {
                    fout<<i<<" "<<q-n<<"\n";
                }
}