Cod sursa(job #806955)

Utilizator danalex97Dan H Alexandru danalex97 Data 3 noiembrie 2012 19:41:09
Problema Strazi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;

ifstream F("strazi.in");
ofstream G("strazi.out");

const int Nmax = 260;

vector<int> A[Nmax],Begin;
int Fixed[Nmax],End[Nmax];
int L[Nmax],R[Nmax];
int N,M,Sol;

typedef vector<int>::iterator IT;

int Look( int Nod )
{
    if ( Fixed[Nod] == 1 ) return 0;
    Fixed[Nod] = 1;

    for (IT it=A[Nod].begin();it!=A[Nod].end();++it)
        if ( R[*it] == 0 )
        {
            L[ Nod ] = *it;
            R[ *it ] = Nod;
            return 1;
        }
    for (IT it=A[Nod].begin();it!=A[Nod].end();++it)
        if ( Look( R[*it] ) )
        {
            L[ Nod ] = *it;
            R[ *it ] = Nod;
            return 1;
        }

    return 0;
}

int DFS(int X)
{
    if ( R[X] == 0 )
        return X;
    return DFS(R[X]);
}

void PrintDFS(int X)
{
    if ( X==0 ) return;
    G<<X<<' ', PrintDFS(R[X]);
}

int main()
{
    F>>N>>M;
    for (int i=1,x,y;i<=M;++i)
    {
        F>>x>>y;
        A[y].push_back(x);
    }

    for ( bool Ok=1; Ok ; )
    {
        Ok = 0;
        memset( Fixed, 0 , sizeof(Fixed) );
        for (int i=1;i<=N;++i)
            if ( L[i] == 0 )
                Ok |= Look( i );
    }

    for (int X=1;X<=N;++X)
        if ( L[X]==0 )
        {
            Begin.push_back(X);
            End[X] = DFS(X);
        }
    for (unsigned i=0;i+1<Begin.size();++i)
        R[End[Begin[i]]]=Begin[i+1];

    G<<Begin.size()-1<<'\n';
    for (int i=0;i+1<int(Begin.size());++i)
        G<<End[Begin[i]]<<' '<<Begin[i+1]<<'\n';
    PrintDFS(Begin[0]);
    G<<'\n';
}