Cod sursa(job #1018234)

Utilizator assa98Andrei Stanciu assa98 Data 29 octombrie 2013 09:04:18
Problema Felinare Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>
using namespace std;

const int MAX_N=9010;

vector<int> A[MAX_N];

int st[MAX_N];
int dr[MAX_N];
int viz[MAX_N];

bool pairup(int nod) {
    if(viz[nod]) {
        return false;
    }
    viz[nod]=1;

    for(vector<int>::iterator it=A[nod].begin(); it!=A[nod].end(); it++) {
        if(!dr[*it]) {
            st[nod]=*it;
            dr[*it]=nod;
            return true;
        }
    }

    for(vector<int>::iterator it=A[nod].begin(); it!=A[nod].end();it++) {
        if(pairup(dr[*it])) {
            st[nod]=*it;
            dr[*it]=nod;
            return true;
        }
    }
    return false;
}

vector<int> cuplaj(int n) {
    bool change=true;
    while(change) {
        change=false;
        memset(viz,0,sizeof(viz));
        for(int i=1;i<=n;i++) {
            if(!st[i]) {
                if(pairup(i)) {
                    change=true;
                }
            }
        }
    }
    
    vector<int> c;
    for(int i=1;i<=n;i++) {
        if(st[i]) {
            c.push_back(i);
        }
    }
    return c;
}


int main() {
    freopen("felinare.in","r",stdin);
    freopen("felinare.out","w",stdout);
    
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++) {
        int a,b;
        scanf("%d%d",&a,&b);
        A[a].push_back(b);
    }
    
    vector<int>c=cuplaj(n);
    printf("%d",2*n-c.size());

    return 0;
}