Pagini recente » Cod sursa (job #975531) | Cod sursa (job #2105788) | Cod sursa (job #1234014) | Cod sursa (job #1478548) | Cod sursa (job #812131)
Cod sursa(job #812131)
#include <fstream>
#include <iostream>
#include <vector>
using namespace std;
ifstream fin("pamant.in");
ofstream fout("pamant.out");
int n, m, rad, nr;
vector<int> g[100001];
vector<int> t, l, niv, noduri, conex;
vector<bool> s, p;
void Df( int nod, int nv );
void Solve( );
int main()
{
int x, y;
fin >> n >> m;
t.resize( n + 1);
niv.resize( n + 1);
l.resize( n + 1);
s.resize( n + 1);
p.resize( n + 1);
for( int i = 1; i <= m; ++i )
{
fin >> x >> y;
g[x].push_back( y );
g[y].push_back( x );
}
for( int i = 1; i <= n; ++i )
if( !s[i] )
{
nr = 0;
rad = i;
conex.push_back( i );
Df( rad, 1 );
Solve();
noduri.clear();
}
int j = 0;
fout << conex.size() << '\n';
for( int i = 0; i < conex.size(); ++i )
fout << conex[i] << ' ';
fout << '\n';
for( int i = 1; i <= n; ++i )
if( p[i] )
j++;
fout << j << '\n';
for( int i = 1; i <= n; ++i )
if( p[i] )
fout << i << ' ';
fin.close();
fout.close();
return 0;
}
void Df( int nod, int nv )
{
if( nv == 2 )
nr++;
noduri.push_back( nod );
niv[nod] = nv;
s[nod] = true;
l[nod] = nv;
for( vector<int>::iterator it = g[nod]. begin(); it != g[nod].end(); ++it )
{
if( !s[*it] )
{
t[*it] = nod;
Df( *it, nv + 1 );
if ( l[*it] < l[nod] )
l[nod] = l[*it];
}
else
if ( l[nod] > niv[*it] && *it != t[nod] )
l[nod] = niv[*it];
}
}
void Solve( )
{
if ( nr > 1 )
p[rad] = true;
for ( vector<int>::iterator i = noduri.begin(); i != noduri.end(); ++i )
if ( *i != rad )
if ( t[*i] != rad && l[*i] >= niv[t[*i]] )
p[t[*i]] = true;
}