Cod sursa(job #812131)

Utilizator Coman95coman cosmin Coman95 Data 13 noiembrie 2012 15:38:49
Problema Componente tare conexe Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.94 kb
#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;
}