Cod sursa(job #2624464)

Utilizator loraclorac lorac lorac Data 4 iunie 2020 21:04:07
Problema Cuplaj maxim in graf bipartit Scor 4
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.71 kb
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream cin("cuplaj.in");
ofstream cout("cuplaj.out");
const int lim=1e3+5;
vector<int> vec[lim];
int c[lim][lim];
int p[lim][lim];
int pred[lim];
queue<int> q;
int main()
{
    int n,m,e,x,y;
    cin>>n>>m>>e;
    for(int i=1;i<=e;++i)
    {
        cin>>x>>y;
        vec[x].push_back(y+n); vec[y+n].push_back(x);
        c[x][y+n]=1;
        p[x][y+n]=1;
    }
    for(int i=1;i<=n;++i)
    {
        vec[i].push_back(0); vec[0].push_back(i);
        c[0][i]=1;
    }
    for(int i=n+1;i<=n+m;++i)
    {
        vec[i].push_back(m+n+1); vec[m+n+1].push_back(i);
        c[i][m+n+1]=1;
    }
    int flow=0,ads;
    do
    {
        for(int i=1;i<=m+n+1;++i)
            pred[i]=0;
        pred[0]=-1;
        q.push(0);
        while(!q.empty())
        {
            int x=q.front();
            q.pop();
            for(auto y:vec[x])
            if(pred[y]==0 and c[x][y]>0)
            {
                pred[y]=x;
                q.push(y);
            }
        }
        if(pred[m+n+1])
        for(int i=n+1;i<=n+m;++i)
        if(pred[i])
        {
            ads=c[i][n+m+1];
            for(int k=i;pred[k]>0;k=pred[k])
                ads=min(ads,c[pred[k]][k]);
            if(ads==0) continue;
            c[i][n+m+1]-=ads,c[m+n+1][i]+=ads;
            for(int k=i;pred[k]>0;k=pred[k])
                c[pred[k]][k]-=ads,c[k][pred[k]]+=ads;
            flow+=ads;
        }
    }while(pred[m+n+1]);
    cout<<flow<<'\n';
    for(int i=1;i<=n;++i)
    for(int j=n+1;j<=n+m;++j)
    if(c[i][j]!=1 and p[i][j]==1)
    {
        cout<<i<<' '<<j-n<<'\n';
        break;
    }
    return 0;
}