Ejemplo n.º 1
0
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;
}