Cod sursa(job #2425149)

Utilizator Bodo171Bogdan Pop Bodo171 Data 24 mai 2019 13:45:14
Problema Cuplaj maxim in graf bipartit Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.13 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
const int nmax=20005;
vector<int> v[nmax];
int start[nmax],q[nmax],lev[nmax];
int source,sink,n,m,i,j,e,nr,p,u,x,nod,y,flux;
struct edge
{
    int to,cap,fl;
}mu[nmax*15];
void add(int x,int y,int c)
{
    v[x].push_back(nr);
    mu[nr]={y,c,0};
    nr++;
    v[y].push_back(nr);
    mu[nr]={x,0,0};
    nr++;
}
bool bfs()
{
    q[u=1]=source;
    for(i=1;i<=sink;i++)
        lev[i]=0;
    lev[source]=1;
    for(p=1;p<=u;p++)
    {
        x=q[p];
        if(x==sink) return 1;
        for(i=0;i<v[x].size();i++)
        {
            nod=mu[v[x][i]].to;
            if((!lev[nod])&&mu[v[x][i]].fl<mu[v[x][i]].cap)
            {
                lev[nod]=lev[x]+1;
                q[++u]=nod;
            }
        }
    }
    return 0;
}
int dfs(int x,int minfl)
{
    int mm,nod;
    if(!minfl) return 0;
    if(x==sink) return minfl;
    for(start[x];start[x]<v[x].size();start[x]++)
    {
        mm=v[x][start[x]];nod=mu[mm].to;
        if(mu[mm].fl<mu[mm].cap&&lev[nod]==lev[x]+1)
        {
            int rec=min(minfl,mu[mm].cap-mu[mm].fl);
            int cc=dfs(nod,rec);
            if(cc)
            {
                mu[mm].fl+=cc;
                mu[(mm^1)].fl-=cc;
                return cc;
            }
        }
    }
    return 0;
}
int main()
{
    ifstream f("cuplaj.in");
    ofstream g("cuplaj.out");
    f>>n>>m>>e;
    source=n+m+1;sink=n+m+2;
    for(i=1;i<=n;i++)
        add(source,i,1);
    for(i=1;i<=m;i++)
        add(n+i,sink,1);
    for(i=1;i<=e;i++)
    {
        f>>x>>y;
        add(x,n+y,1);
    }
    while(bfs())
    {
        bool ok=1;
        for(i=1;i<=sink;i++)
            start[i]=0;
        while(ok)
        {
            int fl=dfs(source,(1<<30));
            ok&=(fl!=0);
            flux+=fl;
        }
    }
    g<<flux<<'\n';
    for(i=1;i<=n;i++)
    {
        for(j=0;j<v[i].size();j++)
        {
            if(mu[v[i][j]].fl==1)
            {
                g<<i<<' '<<mu[v[i][j]].to-n<<'\n';
            }
        }
    }
    return 0;
}