Cod sursa(job #2180338)

Utilizator VladG26Ene Vlad-Mihai VladG26 Data 20 martie 2018 20:05:26
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
vector <int> G[10005];
int N,M,e;
int st[10005],dr[10005],viz[10005];
void citire()
{
    scanf("%d%d%d",&N,&M,&e);
    int nods,nodd;
    for(int i=1;i<=e;i++)
    {
        scanf("%d%d",&nods,&nodd);
        G[nods].push_back(nodd);
    }
}
bool solve(int nod)
{
    if(viz[nod])
        return 0;
    viz[nod]=1;
    for(auto n:G[nod])
    {
        if(!st[n])
        {
            st[n]=nod;
            dr[nod]=n;
            return 1;
        }
    }
    for(auto n:G[nod])
    {
        if(solve(st[n]))
        {
            st[n]=nod;
            dr[nod]=n;
            return 1;
        }
    }
    return 0;
}
int main()
{
    freopen("cuplaj.in","r",stdin);
    freopen("cuplaj.out","w",stdout);
    citire();
    for(bool pos=true;pos;)
    {
        pos=false;
        memset(viz,0,sizeof(viz));
        for(int i=1;i<=N;i++)
        {
            if(!dr[i])
                pos|=solve(i);
        }
    }
    int rasp=0;
    for(int i=1;i<=N;i++)
        rasp+=(dr[i]>0);

    printf("%d\n",rasp);
    for(int i=1;i<=N;i++)
        if(dr[i]>0)
            printf("%d %d\n",i,dr[i]);
    return 0;
}