Cod sursa(job #1125011)

Utilizator Edward2012Eduard Ursinschi Edward2012 Data 26 februarie 2014 15:06:22
Problema Cuplaj maxim in graf bipartit Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
// problema OJI 2012 OZN
int n,k,i,x1,x2,y2,x,j,nr;
int viz[7001],inainte[7001],a,b,c,t,min1,m;
int cap[7001][7001],flux[7001][7001],fluxmax,fx;
vector<int>v[7001];
void DFS(int p)
{viz[p]=1;
 for(int i=0;i<v[p].size();i++) if(!viz[v[p][i]]&&flux[p][v[p][i]]<cap[p][v[p][i]]){DFS(v[p][i]);inainte[v[p][i]]=p;}
}
int main()
{f>>n>>k>>m;nr=n;
 for(i=1;i<=m;i++) {f>>a>>b;
                    a=a+1;
                    b=b+n+2;
                    v[a].push_back(b);
                    v[b].push_back(a);
                    v[1].push_back(a);
                    v[a].push_back(1);
                    v[b].push_back(n+m+2);
                    v[n+m+2].push_back(b);
                    cap[1][a]=1;
                    cap[b][n+m+2]=1;
                    cap[a][b]=1;
                    }

n=m+n+2;
do{
for(i=1;i<=n;i++) inainte[i]=0;
 DFS(1);t=n;min1=10000;
 if(!inainte[n])
    break;
 while(t!=1)
  { if(cap[inainte[t]][t]-flux[inainte[t]][t]<min1) {min1=cap[inainte[t]][t]-flux[inainte[t]][t];}
    t=inainte[t];
  }
  t=n;
while(t!=1)
  { flux[inainte[t]][t]=flux[inainte[t]][t]+min1;
    flux[t][inainte[t]]=flux[t][inainte[t]]-min1;
    t=inainte[t];
  }
for(i=1;i<=n;i++)viz[i]=0;}while(1);
for(i=2;i<=n;i++)
    fluxmax+=flux[1][i];
g<<fluxmax<<'\n';
for(i=2;i<n;i++)
    for(j=2;j<n;j++) if(flux[i][j]==1) g<<i-1<<" "<<j-nr-2<<'\n';
f.close();
g.close();
return 0;
}