std::vector<size_t> topological_sort(const Graph& g) {
  enum class colors { white, gray, black };
  const size_t num_v = g.num_vertices();
  std::vector<size_t> list(num_v);
  std::vector<colors> color(num_v, colors::white);
  size_t cur_pos = num_v;

  std::function<void(size_t)> dfs_visit;
  dfs_visit = [&](const size_t src) {
    color[src] = colors::gray;
    for (const auto e : g.out_edges(src)) {
      const size_t tgt = g.target(e);
      if (color[tgt] == colors::white)
        dfs_visit(tgt);
      else if (color[tgt] == colors::gray)
        throw std::logic_error("Not a DAG");
    }
    color[src] = colors::black;
    list[--cur_pos] = src;
  };

  for (size_t v = 0; v != num_v; ++v)
    if (color[v] == colors::white)
      dfs_visit(v);

  return list;
}
Exemple #2
0
void dfs(Graph* g, int mode){
	int u;
	for (u=0; u < g->nVertices; u++){
		g->color[u]= 'W';
		g->p[u]=-1;
	}
	time = 1;
	if(mode==1){
		for (u=g->nVertices*2-1; u >=0; u--){
			if(temp_fin_aux[u]!=-1){
				if(g->color[temp_fin_aux[u]] == 'W'){
					tamanhoSCC=0;
					scc++;
					dfs_visit(g,temp_fin_aux[u],mode);
					tamanhoSCC++;
				}
				
			}
		
			if(tamanhoSCC>SCCBigger) SCCBigger=tamanhoSCC;
		}	
		return;
	}
	for (u=0; u < g->nVertices; u++){
		if(g->color[u] == 'W'){
			dfs_visit(g,u, mode);
		}
	}

}
Exemple #3
0
void Graph::dfs_visit(int dfsId, int nodeU, std::vector<int> * finishTime, bool transpose, bool undirect){
  colors[nodeU] = 1;

  if( transpose or undirect){
    for(unsigned j=0; j<AdjT[nodeU].size(); j++){
      int nodeV = AdjT[nodeU][j];
      if( colors[nodeV] == 0 ){
        dfsParent[nodeV] = nodeU;
        dfsDiscoveredId[nodeV] = dfsId;
        dfs_visit(dfsId,nodeV,finishTime,transpose,undirect);
      }
    }
  }
  if( (!transpose) or undirect ){
    for(unsigned j=0; j<Adj[nodeU].size(); j++){
      int nodeV = Adj[nodeU][j];
      if( colors[nodeV] == 0 ){
        dfsParent[nodeV] = nodeU;
        dfsDiscoveredId[nodeV] = dfsId;
        dfs_visit(dfsId,nodeV,finishTime,transpose,undirect);
      }
    }
  }

  colors[nodeU] = 2;
  finishTime->push_back(nodeU);
}
Exemple #4
0
bool is_bipartite(const Graph &g, std::vector<bool> &color) {
  const size_t num_v = g.num_vertices();
  std::vector<bool> visited(num_v);
  color.resize(num_v);

  std::function<void(size_t)> dfs_visit;
  dfs_visit = [&](const size_t src) {
    visited[src] = true;
    for (const auto e : g.out_edges(src)) {
      const size_t tgt = (src == g.source(e)) ? g.target(e) : g.source(e);
      if (!visited[tgt]) {
        color[tgt] = !color[src];
        dfs_visit(tgt);
      } else if (color[src] == color[tgt])
        throw std::logic_error("Not bipartite");
    }
  };

  for (size_t v = 0; v != num_v; ++v)
    if (!visited[v])
      try {
        dfs_visit(v); // The color of 'v' is left as is.
      } catch (std::logic_error &) {
        return false;
      }
  return true;
}
Exemple #5
0
void find_bridges(const Graph &g, UnaryFunction output_bridge) {

  const size_t num_v = g.num_vertices();
  size_t time = 0;
  std::vector<size_t> pred(num_v, SIZE_MAX);
  std::vector<size_t> dtm(num_v);
  std::vector<size_t> low(num_v);

  std::function<void(size_t)> dfs_visit;
  dfs_visit = [&](const size_t src) {
    low[src] = dtm[src] = ++time;
    for (const auto e : g.out_edges(src)) {
      const size_t tgt = (src == g.source(e)) ? g.target(e) : g.source(e);
      if (!dtm[tgt]) {
        pred[tgt] = src;
        dfs_visit(tgt);
        low[src] = std::min(low[src], low[tgt]);
        if (low[tgt] > dtm[src])
          output_bridge(e);
      } else if (tgt != pred[src])
        low[src] = std::min(low[src], dtm[tgt]);
    }
  };

  for (size_t v = 0; v != num_v; ++v)
    if (!dtm[v])
      dfs_visit(v);
}
Exemple #6
0
void Graph::build_dfs(int index_node){
    dfs_visit(index_node);
    for(auto n:list_graph){
        if(n.second.color==white){
            dfs_visit(n.first);
        }
    }
    print_dfs();
}
Exemple #7
0
static int
dfs_visit (L_Cb * cb, Set blocks, L_Cb * header)
{
  L_Flow *dest;
  L_Cb *dest_cb;
  int cycle = 0;

  cb->flags = L_SET_BIT_FLAG (cb->flags, L_CB_VISITED);

  for (dest = cb->dest_flow; dest; dest = dest->next_flow)
    {
      dest_cb = dest->dst_cb;

      /* Ignore backedges to region header and side exit arcs */

      if ((dest_cb == header) ||
	  !Set_in (blocks, dest_cb->id))
	continue;

      if (!L_EXTRACT_BIT_VAL (dest_cb->flags, L_CB_VISITED))
	cycle |= dfs_visit (dest_cb, blocks, header);
      else if (!L_EXTRACT_BIT_VAL (dest_cb->flags, L_CB_VISITED2))
	cycle = 1;
    }

  cb->flags = L_SET_BIT_FLAG (cb->flags, L_CB_VISITED2);

  return cycle;
}
Exemple #8
0
std::vector<int> * Graph::dfs( bool transpose=false, bool undirect=false, std::vector<int> * rOrder=NULL){
 
  int size = numberOfVertices;
  for(int i=0; i<size; i++){
    colors[i] = 0;
    dfsParent[i] = -1;
    dfsDiscoveredId[i] = -1;
  }

  std::vector<int> * finishTime = new std::vector<int> ();

  int dfsId = -1;
  for(int i=0; i<size; i++){
    int node = i;

    if( rOrder != NULL ) { node = rOrder->at( size - i -1); }
    
    if( colors[node] == 0 ){
  //    std::cout << "Dfs a partir de: " << node+1 << "\n";
      dfsId++;
      dfsDiscoveredId[node] = dfsId;
      dfs_visit(dfsId,node, finishTime, transpose, undirect);
    }
  }
  numberOfSCCs = dfsId+1;
  return finishTime;
}
Exemple #9
0
void dfs(int G[6][6], char E[6][6]){
	int visited[6]={0,0,0,0,0,0},i,j,time=0;
	int start[6] = {0,0,0,0,0,0};
	int finish[6] = {0,0,0,0,0,0};	
	for(i=0;i<6;i++){
		if(!visited[i])
		dfs_visit(i,G,E,visited,start,finish);
	}
	printf("start :");
	for(i=0;i<6;i++)
		printf("%d ",start[i]);
	printf("\nfinish:");
	for(i=0;i<6;i++)
		printf("%d ",finish[i]);
	printf("\n");
	for(i=0;i<6;i++)
	{
		for(j=0;j<6;j++){
			if(G[i][j]){
					if(start[j]<start[i] && start[i]<finish[i] && finish[i]<finish[j])
						E[i][j] = 'B';
					if(start[i]<start[j] && start[j]<finish[j] && finish[j]<finish[i] && E[i][j]!='T')
						E[i][j] = 'F';
					if(start[j]<finish[j] && finish[j]<start[i] && start[i]<finish[i])
						E[i][j] = 'C';								
					printf("%c ",E[i][j]);	
			}
			else
				printf("* ");	
			}
		printf("\n");
	}		
	toposort(finish);	
}
void dfs_visit(graph* g,node* s)
{
	s->d = ++timer ;
	s->low = s->d ;
	s->color = gray ;
	edge* curedge = g->adjlist[s->idx]->firstedge ;
	for( ; curedge != NULL ; curedge = curedge->next)
	{
		node* cur = curedge->v ;	
		if(cur->color == white)
		{
			cur->parent = s ;
			dfs_visit(g,cur) ;

			s->low = min(s->low , cur->low) ;
			if( (cur->low)  > (s->d) )	
			{
				printf("%d %d\n" , s->idx , cur->idx) ;
			}		
		}
		else if(cur != s->parent)
		{
			s->low = min(s->low , cur->d) ;
		}
	} 
	s->f = ++timer ;
	s->color = black ;
}
Exemple #11
0
void DFS(Graph *p)
{
    for(int i = 0; i<p->nodes.size(); i++)
    {
        p->nodes[i]->color = 0;
//        p->nodes[i]->prev = DIS_INF;
    }
    time1 = 0;

    for(int i = 0; i<p->nodes.size();i++)
    {
        if(p->nodes[i]->color == 0)
        {
            temp = new CC("temp");

            cout<<endl;
//            cout<<"nodes id draw: "<<p->nodes[i]->id+1<<endl;
            cout<<p->nodes[i]->left<<" ";
            cout<<p->nodes[i]->down<<" ";
            cout<<p->nodes[i]->right<<" ";
            cout<<p->nodes[i]->top<<endl;
            dfs_visit(p,p->nodes[i]);

            p->connected.push_back(temp);

        }
    }
}
Exemple #12
0
void dfs_visit(int u,int V,int G[V][V],char E[V][V],int color[],int parent[]){
	color[u]=G;
	int v,t;
	for(v=0;v<V;i++){
		if(G[u][v]){
			switch(color[v]){
				case W:	E[u][v]='T';
					parent[v]=u;
					dfs_visit(v,V,G,E,color,parent);
					break;
				case G: E[u][v]='B';
					break;					
				case B: t=v;
					while(parent[t]!=v){
						if(parent[t]==u){
							E[u][v]='F';
							break;
						}
						t=parent[t];
					}
					if(E[u][v]!='F')
						E[u][v]='C';
					break;
			}
		}
	}
}
Exemple #13
0
void dfs_visit(Graph* g, int u, int mode){
	List* auxlist;
	g->color[u] = 'G';
	g->d[u] = time; 
	time++;
	auxlist = g->listaAdjac[u];
	if(mode==1) verticeSCC[u]=scc;
	while(auxlist != NULL){
		if(auxlist->value != -1){
			if (g->color[auxlist->value-1] == 'W'){
				g->p[auxlist->value-1] = u;
				dfs_visit(g,auxlist->value-1,mode);
				tamanhoSCC++;
				
				
			}
			else if(g->color[auxlist->value-1]=='B' && mode==1){
				if(sccBit[verticeSCC[auxlist->value-1]]==0  && verticeSCC[auxlist->value-1]!=verticeSCC[u]){
					GtconnectSCC++;
					sccBit[verticeSCC[auxlist->value-1]]=1;
				}
				
					
			}
		}
		auxlist=auxlist->next;
	}
	g->color[u] = 'B';
	g->f[u] = time;
	if(mode==0){
		temp_fin_aux[g->f[u]-1] =  u;
	}	
	time++;
}
Exemple #14
0
void dfs_visit(Graph* p, Node* in)
{
    time1 = time1 + 1;
    in->d = time1;
    in->color = -1;
    if(in->edge.size() == 0)
    {
        temp->nodes.push_back(in);
    }
//    cout<<"aa"<<in->edge.size()<<endl;
    for(int i = 0; i<in->edge.size();i++)
    {
        if(in->edge[i]->getNeighbor(in)->color == 0)
        {

//            CC* c1 = new CC("1");
//            c1->addEdge(in,in->edge[i]->getNeighbor(in));
//            p->connected.push_back(c1);
            temp->addEdge(in, in->edge[i]->getNeighbor(in));

            in->edge[i]->getNeighbor(in)->prev = in;
//            cout<<"nodes id draw: "<<in->edge[i]->getNeighbor(in)->id+1<<endl;
            cout<<p->nodes[in->edge[i]->getNeighbor(in)->id]->left<<" ";
            cout<<p->nodes[in->edge[i]->getNeighbor(in)->id]->down<<" ";
            cout<<p->nodes[in->edge[i]->getNeighbor(in)->id]->right<<" ";
            cout<<p->nodes[in->edge[i]->getNeighbor(in)->id]->top<<endl;
            dfs_visit(p,in->edge[i]->getNeighbor(in));
        }
        in->color = 1;
        time1 = time1 + 1;
        in->f = time1;
    }

}
Exemple #15
0
int main(void){
	int t;
	int n,a,b,i;
	int hq1,hq2;
	scanf("%d",&t);
	while(t--){
		scanf("%d%d%d",&n,&hq1,&hq2);
		arr= createlist(n);
		for(i=1;i<hq1;i++){
			scanf("%d",&a);
			arr[i].add(a);
			arr[a].add(i);
		}
		for(i=hq1+1;i<=n;i++){
			scanf("%d",&a);
			arr[i].add(a);
			arr[a].add(i);
		}
		dfs_visit(hq2);
		for(i=1;i<hq2;i++)
			printf("%d ",arr[i].parent);
        for(i=hq2+1;i<=n;i++)
			printf("%d ",arr[i].parent);

		printf("\n");
	}
	return 0;
}
Exemple #16
0
static void dfs (void) {
     i_bb_t b;
     for (b = i_fg_root; b; b = b->lnext)
	  b->color = WHITE;
     dfn = num_bb+1;
     NEW(nodes, dfn); 
     dfs_visit(i_fg_root);	/* nodes[dfn..num_bb] stores visited nodes */
     assert(dfn);
}
static void dfs(){
    int i;
    for(i=0;i<N;i++){color[i]=white;parent[i]=-1;time_stamp[i][0]=time_stamp[i][1]=0;}
    time=0;
    for(i=0;i<N;i++){
            if(color[i]==white)
                dfs_visit(i);
    }

}
Exemple #18
0
/*
 * LB_hb_region_contains_cycle
 * ----------------------------------------------------------------------
 * Given a set of CB ids and a header CB, return 1 iff the region
 * contains a cycle which does not include the header; 0 otherwise.
 */
int
LB_hb_region_contains_cycle (Set blocks, L_Cb * header)
{
  int i, num_cb, *buf, cycle = 0;
  L_Cb *cb;

  num_cb = Set_size (blocks);
  buf = (int *) alloca (sizeof (int) * num_cb);
  Set_2array (blocks, buf);

  for (i = 0; i < num_cb; i++)
    {
      cb = L_cb_hash_tbl_find (L_fn->cb_hash_tbl, buf[i]);
      cb->flags = L_CLR_BIT_FLAG (cb->flags, L_CB_VISITED);
      cb->flags = L_CLR_BIT_FLAG (cb->flags, L_CB_VISITED2);
    }

  if (dfs_visit (header, blocks, header))
    {
      cycle = 1;
    }
  else
    {
      for (i = 0; i < num_cb; i++)
	{
	  cb = L_cb_hash_tbl_find (L_fn->cb_hash_tbl, buf[i]);
	  if (L_EXTRACT_BIT_VAL (cb->flags, L_CB_VISITED))
	    continue;
	  if (dfs_visit (cb, blocks, header))
	    {
	      cycle = 1;
	      break;
	    }
	}
    }

#ifdef DEBUG_CYCLE
  if (cycle)
    fprintf (stderr, "cycle in region (header %d)\n", header->id);
#endif

  return cycle;
}
static void dfs_visit(int u){

    time_stamp[u][0]=++time;
    color[u]=gray;
    int i;
    for(i=0;i<N;i++){if(graph[u][i]==1 && color[i]==white){parent[i]=u;dfs_visit(i);}}
    printf("%d ",u);
    time_stamp[u][1]=++time;
    color[u]=black;

}
Exemple #20
0
void dfs(adj_table& adj) {
	Sequence visitSequence(1, 0);
	Table edgeColor;

	if(dfs_visit(0, visitSequence, adj, edgeColor)) {
		visitSequence.pop_back();
		std::copy(visitSequence.begin(), visitSequence.end(),
			std::ostream_iterator<unsigned>(std::cout, " -> "));

		std::cout << "0\n";
	}
}
void dfs(DFSVertex* vertices, int nelem) {
	for (int u = 0; u < nelem; u++) {
		vertices[u].super.color = WHITE;
		vertices[u].super.parent = -1;
	}
	dfs_time = 0;
	for (int u = 0; u < nelem; u++) {
		if (vertices[u].super.color == WHITE) {
			dfs_visit(vertices, nelem, u);
		}
	}
}
Exemple #22
0
void dfs_visit(int a){
	arr[a].set_visited();
	node *temp;
	int val;
	for(temp=arr[a].head.next;temp;temp=temp->next){
		val=temp->value;
		if(arr[val].not_visited()){
			arr[val].parent=a;
			dfs_visit(val);
		}
	}
}
void dfs(graph* g)
{
	int i ;
	timer = 0 ;
	for(i=1; i<= (g->vertices) ; ++i)
	{
		if(g->v[i]->color == white)	
		{
			dfs_visit(g,g->v[i]) ;
		}
	}
}
Exemple #24
0
void dfs_visit(int u,int G[6][6],char E[6][6],int visited[],int start[], int finish[]){
	int v;
	visited[u]=1;
	printf("%d\n",u);
	start[u]=++time;
	for(v=0;v<6;v++){
		if(G[u][v] && !visited[v]){
			E[u][v] = 'T';
			//E[u][v] = E[v][u] = 'T';
			dfs_visit(v,G,E,visited,start,finish);
		}	
	}
	finish[u]=++time;
}
Exemple #25
0
void detect_cycles(void)
{
struct wait_graph_node *ptr_wait;
//printf("\ndetect_cycle");
//fflush(stdout);
ptr_wait = head_wait_graph;
while(ptr_wait!= NULL)
{
	if(ptr_wait->visited == 0)/*not visited*/
		dfs_visit(ptr_wait);
	ptr_wait = ptr_wait->next;
}

}
Exemple #26
0
static void dfs_visit (i_bb_t b) {
     i_bb_t *n = b->n;		/* List of successors */
     unsigned int nn = b->nn;	/* Number of successors */
     unsigned int i;

     b->color = BLACK;
     for (i = 0; i < nn; i++)	/* Recurse on successors */
	  if (n[i]->color == WHITE)
	       dfs_visit(n[i]);
     nodes[--dfn] = b;
#ifndef NDEBUG
     b->dfn = dfn;
#endif
}
void dfs_visit(DFSVertex* vertices, int nelem, int u) {
	dfs_time++;
	vertices[u].d = dfs_time;
	vertices[u].super.color = GRAY;
	for (Adj* v = vertices[u].super.first; v; v = v->next) {
		if (vertices[v->n].super.color == WHITE) {
			vertices[v->n].super.parent = u;
			dfs_visit(vertices, nelem, v->n);
		}
	}
	vertices[u].super.color = BLACK;
	dfs_time++;
	vertices[u].f = dfs_time;
}
void dfs_visit(graph_list& g, int p, int *visited, int& time)
{//返回dfs搜索节点p的递归次数
 //即从节点p开始dfs遍历到的节点数量,也是递归遍历花费的时间
	print_node(&g.g_l[p][0]);
	visited[p] = 1;
	for(int i = 1; i < (int)g.g_l[p].size(); ++ i)
		//寻找节点p的邻节点中,尚未被访问的所有邻节点
		if(!visited[g.g_l[p][i].g_idx])
			//对未被访问的所有节点进行下一轮dfs递归
			//在有向图中,将当前节点看作子树中的根节点,所有其邻节点看作该节点的孩子
			//则dfs过程也可以看作对当前节点的子树进行一次遍历
			dfs_visit(g, g.g_l[p][i].g_idx, visited, time);
	g.g_l[p][0].g_value = time ++;
}
Exemple #29
0
void Graph::dfs_visit(int index_node){
    time++;
    list_graph[index_node].distance=time;
    list_graph[index_node].color=grey;
    for(auto i : list_graph[index_node].connect_node){
        Node &n=list_graph[i];
        if(n.color==white){
            n.front=&list_graph[index_node];
            dfs_visit(i);
        }
    }
    list_graph[index_node].color=black;
    time++;
    list_graph[index_node].finish=time;
}
Exemple #30
0
void dfs(int V,int G[V][V]){
	int color[V],parent[V],i;
	char E[V][V];
	for(i=0;i<V;i++){
		color[i]=W;
		parent[i]=i;
	}
	for(i=0;i<V;i++)
		for(j=0;j<V;j++)
			E[i][j]='*';
	for(i=0;i<V;i++)
		if(color[i]==W)
			dfs_visit(i,V,G,E,color,parent);
	display(V,E);
}