Cod sursa(job #987025)

Utilizator ericptsStavarache Petru Eric ericpts Data 19 august 2013 22:12:12
Problema Strazi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.86 kb
#include <vector>
#include <fstream>
#include <cstring>
#include <cstdio>
#include <utility>
#include <algorithm>

using namespace std;

ifstream f_in("strazi.in");

const int MAX_N = 260;

vector<int> G[MAX_N];

int n,m;

int mate[MAX_N];
int taken_by[MAX_N];
bool init[MAX_N];

bool viz[MAX_N];

bool pair_up(const int nod)
{
    if(viz[nod])
        return false;
    viz[nod] = 1;
    for(auto it:G[nod]){
        if(!taken_by[it]){
            mate[nod] = it;
            taken_by[it] = nod;
            return true;
        }
    }
    for(auto it:G[nod]){
        if(pair_up(taken_by[it])){
            mate[nod] = it;
            taken_by[it] = nod;
            return true;
        }
    }
    return false;
}

void match()
{
    int i;
    bool matched = true;
    while(matched){
        matched = false;
        for(i = 1 ; i <= n ; ++ i)
            if(!viz[i] && !mate[i])
                matched |= pair_up(i);
        memset(viz,0,sizeof(viz));
    }
}

vector<int> dfs;

void road(const int nod)
{
    dfs.push_back(nod);
    if(taken_by[nod])
        road(taken_by[nod]);
}

int main()
{
    freopen("strazi.out", "w", stdout);;
    f_in >> n >> m;
    int i,a,b;
    for(i = 1 ; i <= m ; ++ i){
        f_in >> a >> b;
        G[b].push_back(a);
        init[a] = true;
    }
    match();
    int extra = -1;
    for(i = 1 ; i <= n ; ++ i)
        extra += mate[i] == 0;

    printf("%d\n",extra);

    for(i = 1 ; i <= n ; ++ i)
        if(!mate[i])
            road(i);

    //reverse(dfs.begin(),dfs.end());

    for(i = 0 ; i < dfs.size() - 1 ; ++ i){
        const int now = dfs[i],
                  next = dfs[i+1];
        if(init[now])continue;
        printf("%d %d\n",now,next);
    }
    for(i = 0 ; i < dfs.size() ; ++ i)
        printf("%d ",dfs[i]);

    return 0;
}