0w1

CFR 688 C. NP-Hard Problem ( Bipartite Coloring )

Problem - C - Codeforces
It's not difficult to see that only a bipartite graph will meet the requirements.

bool dfs( int u, const vvi &G, vi &col ){
    for( int v : G[ u ] ){
        if( col[ v ] && col[ u ] == col[ v ] ) return false;
        if( !col[ v ] ){
            col[ v ] = 3 - col[ u ];
            if( !dfs( v, G, col ) ) return false;
        }
    }
    return true;
}

void solve(){
    int N, M; cin >> N >> M;
    vvi G( N );
    for( int i = 0; i < M; ++i ){
        int u, v; cin >> u >> v;
        --u, --v;
        G[ u ].push_back( v );
        G[ v ].push_back( u );
    }
    vi col( N );
    for( int u = 0; u < N; ++u )
        if( !col[ u ] ){
            col[ u ] = 1;
            if( !dfs( u, G, col ) ){
                cout << "-1\n";
                return;
            }
        }
    vi ans;
    for( int u = 0; u < N; ++u )
        if( col[ u ] == 1 )
            ans.push_back( u + 1 );
    cout << ans.size() << "\n";
    for( int i = 0; i < ans.size(); ++i )
        cout << ans[ i ] << ( i + 1 == ans.size() ? '\n' : ' ' );
    ans.clear();
    for( int u = 0; u < N; ++u )
        if( col[ u ] == 2 )
            ans.push_back( u + 1 );
    cout << ans.size() << "\n";
    for( int i = 0; i < ans.size(); ++i )
        cout << ans[ i ] << ( i + 1 == ans.size() ? '\n' : ' ' );
}