Cod sursa(job #245817)

Utilizator runnaway90Oprescu Radu Constantin runnaway90 Data 18 ianuarie 2009 23:01:40
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include<stdio.h>
#include<string.h>
#include<vector>

#define N 20003
#define INF 2000000

using namespace std;

long tata[N], q[N], s, d, n, m;
bool c[N][N];

vector<long> a[N]; 

long bfs(){
long x,p,u,i,ok=0;
    memset(tata,0,(n+m+3)*sizeof(long));
    q[0]=s;tata[s]=1;
    for (p=0,u=0;p<=u;p++){
        x=q[p];
        for (i=0;i<a[x].size();i++)
            if (!tata[a[x][i]] && c[x][a[x][i]]>0){
               if (a[x][i]==d){ ok=1;continue;}
               q[++u]=a[x][i],tata[a[x][i]]=x;
            }
    }
    return (ok);
}

int main(){
long flux=0, w, x, y, i, j;

    freopen("cuplaj.in","r",stdin);freopen("cuplaj.out","w",stdout);
    scanf("%ld %ld %ld",&n,&m,&w);
    for (;w>0;w--){
        scanf("%ld %ld",&x,&y);
        c[x][n+y]=1;
        a[x].push_back(n+y);a[n+y].push_back(x);
    }
    
    for (i=1;i<=n;i++) {
        c[n+m+1][i]=1;
        a[n+m+1].push_back(i);a[i].push_back(n+m+1);
    }
    for (i=1;i<=m;i++) {
        c[n+i][n+m+2]=1;
        a[n+i].push_back(n+m+2);a[n+m+2].push_back(n+i);
    }
    s=n+m+1;d=n+m+2;
    
    while (bfs()){
          for (w=0;w<a[d].size();w++)
              if (tata[a[d][w]]){
                 c[a[d][w]][d]-=1;c[d][a[d][w]]+=1;
                 for (i=a[d][w];i!=s;i=tata[i])
                     c[tata[i]][i]-=1,c[i][tata[i]]+=1;
                 flux++;  
              }
    }
    printf("%ld\n",flux);
    for (i=1;i<=n;i++)
        for (j=1;j<=m;j++)
            if (c[n+j][i]==1) printf("%ld %ld\n", i,j);
        
    return 0;

}