Cod sursa(job #1549706)

Utilizator mihaivasilacheMIhai Vasilache mihaivasilache Data 12 decembrie 2015 17:39:37
Problema Cuplaj maxim in graf bipartit Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 3.32 kb
#include <fstream>
using namespace std;
fstream fin;
ofstream fout("cuplaj.out");
#define N 20000
#define cin fin
struct nod
{
    int info;
    nod *next=NULL;
} v[N];
nod *prezent[N];
int n;
int l[N]; //l[i]=nr de vecninii lui i
//int v[N][N]; //v[i][j]=al j-lea vecin
int na;//cate noduri sunt in partea stanga
int c[N]; //c[i]=-1, daca i nu este cuplat
//c[i]=j, daca este cuplat cu nodul j
int viz[N];
int nb,m;
void initializare_c(int c[N],int n,int ini)
{
    int i;
    for(i=0; i<n; i++)
        c[i]=ini;
}
int dfs(int i)
{
    viz[i]=1;
    int j;
    nod *q;
    q=&v[i];
    for(j=1; j<=l[i]; j++)
    {
        int k=q->info;
        q=q->next;
        if(viz[k]||c[i]==k) continue;

        if(c[k]==-1)
        {
            c[k]=i;
            c[i]=k;
            viz[k]=1;
            return 1;
        }
        else
        {
            viz[k]=1;
            if(dfs(c[k]))
            {
                c[i]=k;
                c[k]=i;
                return 1;
            }
            else continue;
        }
    }
    return 0;
}
int i;
struct nod1
{
    int x,y;
    nod1 *next;
};
void greedy()
{
    int i,j;
    nod *q;
    for(i=0; i<na; i++)
    {
        if(l[i]!=0)
        {
            q=&v[i];
            while(q!=NULL)
            {
                if(c[i]==-1&&c[q->info]==-1)
                {
                    viz[i]=1;
                    viz[q->info]=1;
                    c[i]=q->info;
                    c[q->info]=i;
                    break;
                }
                else q=q->next;
            }
        }
    }
}
int main()
{
    FILE * fin;
    fin=fopen("cuplaj.in","r");
    fscanf(fin,"%d%d%d",&na,&nb,&m);
    int x,y;
    n=na+nb;
    nod *q;
    for(i=1; i<=m; i++)
    {
        fscanf(fin,"%d%d",&x,&y);
        x--;
        y--;
        y=y+na;
        l[x]++;
        l[y]++;
        if(prezent[x]==NULL)
        {
            prezent[x]=&v[x];
            prezent[x]->info=y;
            prezent[x]->next=NULL;
        }
        else
        {
            q=new nod();
            q->info=y;
            q->next=NULL;
            prezent[x]->next=q;
            prezent[x]=q;
        }
        if(prezent[y]==NULL)
        {
            prezent[y]=&v[y];
            prezent[y]->info=x;
            prezent[y]->next=NULL;
        }
        else
        {
            q=new nod();
            q->info=x;
            q->next=NULL;
            prezent[y]->next=q;
            prezent[y]=q;
        }
    }
    initializare_c(c,n,-1);
    greedy();
    int ok=1;
    while(ok)
    {
        ok=0;
        initializare_c(viz,n,0);
        for(i=0; i<na; ++i)
            if(!viz[i]&&c[i]==-1)
                if(dfs(i))
                    ok=1;
    }
    int contor=0;
    nod1 *qq;
    nod1 *ls;
    nod1 *prez;
    prez=new nod1();
    ls=prez;
    qq=ls;
    for(i=0; i<na; i++)
    {
        if(c[i]!=-1)
        {
            contor++;
            qq->x=i+1;
            qq->y=c[i]-na+1;
            qq=new nod1();
            qq->next=NULL;
            prez->next=qq;
            prez=qq;
        }
    }
    fout<<contor<<endl;
    while(ls->next!=NULL)
    {
        fout<<ls->x<<' '<<ls->y<<endl;
        ls=ls->next;
    }
    return 0;
}