Pagini recente » Cod sursa (job #2708207) | Cod sursa (job #2965378) | Cod sursa (job #252621) | Cod sursa (job #1835839) | Cod sursa (job #1953221)
#include <bits/stdc++.h>
using namespace std;
fstream in ( "strazi.in" , ios::in );
fstream out( "strazi.out", ios::out );
const int DIM = 3e2 + 5;
int lef[DIM], rig[DIM];
bitset<DIM> oki;
vector<int> edg[DIM]; vector<vector<int>> lst;
bool slv( int x ) {
if( oki[x] == true )
return false;
oki[x] = true;
for( int y : edg[x] ) {
if( rig[y] == 0 ) {
lef[x] = y;
rig[y] = x;
return true;
}
}
for( int y : edg[x] ) {
if( slv( rig[y] ) == true ) {
lef[x] = y;
rig[y] = x;
return true;
}
}
return false;
}
void dfs( int x ) {
oki[x] = true;
lst.back().push_back( x );
if( lef[x] != 0 )
dfs( lef[x] );
return;
}
int main( void ) {
int n, m;
in >> n >> m;
for( int i = 1; i <= m; i ++ ) {
int x, y;
in >> x >> y;
edg[x].push_back( y );
}
bool ok;
do {
ok = false; oki.reset();
for( int i = 1; i <= n; i ++ ) {
if( lef[i] == 0 && slv( i ) == true )
ok = true;
}
} while( ok == true );
oki.reset();
for( int i = 1; i <= n; i ++ ) {
if( rig[i] == 0 ) {
lst.push_back( vector<int>(0) );
dfs( i );
}
}
out << lst.size() - 1 << "\n";
for( int i = 1; i < lst.size(); i ++ )
out << lst[i - 1].back() << " " << lst[i].front() << "\n";
for( vector<int> ls : lst )
for( int x : ls )
out << x << " ";
out << "\n";
return 0;
}