/* Merge the nodes of a min, max, or same rank set. */ void collapse_rankset(graph_t *g, graph_t *subg, int kind) { node_t *u,*v; u = v = agfstnode(subg); if (u) { ND_ranktype(u) = kind; while ((v = agnxtnode(subg,v))) { UF_union(u,v); ND_ranktype(v) = ND_ranktype(u); } switch (kind) { case MINRANK: case SOURCERANK: if (GD_minset(g) == NULL) GD_minset(g) = u; else GD_minset(g) = UF_union(GD_minset(g),u); break; case MAXRANK: case SINKRANK: if (GD_maxset(g) == NULL) GD_maxset(g) = u; else GD_maxset(g) = UF_union(GD_maxset(g),u); break; } switch (kind) { case SOURCERANK: GD_minset(g)->u.ranktype = kind; break; case SINKRANK: GD_maxset(g)->u.ranktype = kind; break; } } }
static void cluster_leader(graph_t * clust) { node_t *leader, *n; int maxrank = 0; /* find number of ranks and select a leader */ leader = NULL; for (n = GD_nlist(clust); n; n = ND_next(n)) { if ((ND_rank(n) == 0) && (ND_node_type(n) == NORMAL)) leader = n; if (maxrank < ND_rank(n)) maxrank = ND_rank(n); } assert(leader != NULL); GD_leader(clust) = leader; for (n = agfstnode(clust); n; n = agnxtnode(clust, n)) { assert((ND_UF_size(n) <= 1) || (n == leader)); UF_union(n, leader); ND_ranktype(n) = CLUSTER; } }