Pagini recente » Cod sursa (job #1313922) | Cod sursa (job #913641) | Cod sursa (job #2698421) | Cod sursa (job #1857308) | Cod sursa (job #806955)
Cod sursa(job #806955)
#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';
}