List random_permut(const List& L) { int n = L.size(); List perm = random_permut(n); List l; try { l.resize(n); } catch(std::exception& e) {myexception(e);} for (int i=0; i<n; i++) l[i] = L[perm[i]]; return l; }
unsigned get_size_of_one_random_cut( const Graph& graph ) { std::vector<unsigned> shuffle = random_permut( graph.m ); UnionFind uf( graph.n ); unsigned i = 0; while ( uf.getNumberOfClusters() > 2 && i < graph.m ) { const Edge& edge = graph.edges[ shuffle[i] ]; uf.doUnion( edge.first, edge.second ); ++i; } if ( uf.getNumberOfClusters() != 2 ) { // maybe the graph is not connected? return UINT_MAX; } unsigned cut_size = 0; for ( unsigned j = 0; j < graph.m; ++j ) { const Edge& edge = graph.edges[ j ]; if ( uf.findLeader( edge.first ) != uf.findLeader( edge.second ) ) { ++cut_size; } } return cut_size; }