Cod sursa(job #1681462)

Utilizator VladTiberiuMihailescu Vlad Tiberiu VladTiberiu Data 9 aprilie 2016 14:35:39
Problema Felinare Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <fstream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <stack>
#include <iomanip>

#define NMax 8195

using namespace std;
ifstream f("felinare.in");
ofstream g("felinare.out");

int viz[NMax],vL[NMax],vR[NMax];

int n,m,x,y,w,ANS;

vector<int> G[NMax];

int cuplaj(int nod){
    if(viz[nod] == 1)
        return 0;
    viz[nod] = 1;
    for(int i = 0; i < G[nod].size(); ++i){
        if(vL[G[nod][i]] == 0){
            vL[G[nod][i]] = nod;
            vR[nod] = G[nod][i];
            return 1;
        }
    }
    for(int i = 0; i < G[nod].size(); ++i){
        if(cuplaj(vL[G[nod][i]])){
            vL[G[nod][i]] = nod;
            vR[nod] = G[nod][i];
            return 1;
        }
    }
}
int main()
{
    f >> n >> m;
    for(int i = 1; i <= m; ++i){
        f >> x >> y;
        G[x].push_back(y);
    }
    int ok = 1;
    while(ok){
        ok = 0;
        memset(viz,0,sizeof(viz));
        for(int i = 1; i <= n; ++i){
            if(!vR[i]){
                if(cuplaj(i)){
                    ok = 1;
                    ANS++;
                }
            }
        }
    }
    for(int i = 1; i <= n; ++i){

        for(int j = 0; j < G[i].size(); ++j){
            if(vL[G[i][j]] == 0){
                ANS++;
                vL[G[i][j]] = i;
            }
            if(vR[i] == 0 && vL[G[i][j]] != 0){
                vR[i] = G[i][j];
                ANS++;
            }
        }
    }
    g << 2 * ANS;
    return 0;
}