Ejemplo n.º 1
0
//Traverse the graph from vertex v
void GraphAdjArray::DFSTree(int v, PCSTreeNode t, bool* visited)
{
	visited[v] = true;
	bool first = true;

	CSTreeNode *p = NULL, *q = NULL;
	int w;
	for(w = FirstAdjVertex(v); w >= 0; w = NextAdjVertex(v, w))
	{
		if(visited[w])
		{
			continue;
		}

		p = new CSTreeNode(&vexs[w]);
		if(first)
		{
			t->firstchild = p;
			first = false;
		}
		else
		{
			assert(q != NULL);
			q->nextsibling = p;
		}
		q = p;

		DFSTree(w, p, visited);
	}
}
/**
 * 这个函数的作用是从第V个顶点出发深度优先遍历图G,建立以T为根的生成树
 * 深度优先遍历
 */
void MGraphAL::DFSTree(int v, CSNode *r, bool *visited)
{
    visited[v] = true;	//把当前节点访问掉
    //设定一个标志,用来确定是不是第一个t下面第一个子树
    bool first = true;
    CSNode *q = nullptr;
    //访问的当前顶点是否有联通量
    if (vertices[v].firstarc == nullptr)
        return;
    for (ArcNode *w = vertices[v].firstarc; w != nullptr; w = w->nextarc)
    {
        //首先查看这个节点是否已经被查看
        if (!visited[w->adjvex])
        {
            CSNode *p = new CSNode();
            p->name = vertices[w->adjvex].name;
            //看看是不是第一次访问
            if (first)
            {
                //如果是这个顶点的开始的第一个节点,那么就作为节点的孩子节点
                r->firstchild = p;
                first = false;
                q = r;	//那么我们的指针q指向我们的前面的父节点
            }//if
            else
            {
                //邻接矩阵的第一个节点是我们的孩子节点,其他的节点是这个孩子节点的兄弟节点
                q->nextSibling = p;
            }//else
            //q = p;
            DFSTree(w->adjvex, p, visited);
        }//if
    }//for
}
Ejemplo n.º 3
0
void GraphAdjArray::DFSForest(PCSTreeNode* t)
{
	if(vexnum <= 0)
	{
		return;
	}

	bool* visited = new bool[vexnum];
	memset(visited, 0, sizeof(bool) * vexnum);

	CSTreeNode *p = NULL, *q = NULL;
	for(int v = 0; v < vexnum; v++)
	{
		if(visited[v])
		{
			continue;
		}

		p = new CSTreeNode(&vexs[v]);
		if(*t == NULL)
		{
			*t = p;
		}
		else
		{
			assert(q != NULL);
			q->nextsibling = p;
		}
		q = p;

		DFSTree(v, p, visited);
	}

	delete []visited;
}
Ejemplo n.º 4
0
 void DFSTree(ALGraph G,int v,CSTree *T)
 { /* 从第v个顶点出发深度优先遍历图G,建立以T为根的生成树。算法7.8 */
   Boolean first=TRUE;
   int w;
   CSTree p,q;
   VertexType v1,w1;
   visited[v]=TRUE;
   strcpy(v1,*GetVex(G,v));
   for(w=FirstAdjVex(G,v1);w>=0;w=NextAdjVex(G,v1,strcpy(w1,*GetVex(G,w)))) /* w依次为v的邻接顶点 */
     if(!visited[w]) /* w顶点不曾被访问 */
     {
       p=(CSTree)malloc(sizeof(CSNode)); /* 分配孩子结点 */
       strcpy(p->data,*GetVex(G,w));
       p->firstchild=NULL;
       p->nextsibling=NULL;
       if(first)
       { /* w是v的第一个未被访问的邻接顶点 */
         (*T)->firstchild=p;
         first=FALSE; /* 是根的第一个孩子结点 */
       }
       else /* w是v的其它未被访问的邻接顶点 */
	 q->nextsibling=p; /* 是上一邻接顶点的兄弟姐妹结点 */
       q=p;
       DFSTree(G,w,&q); /* 从第w个顶点出发深度优先遍历图G,建立子生成树q */
     }
 }
Ejemplo n.º 5
0
 void DFSTree(ALGraph G,int v,CSTree &T)
 { // 从第v个顶点出发深度优先遍历图G,建立以T为根的生成树。算法7.8
   Boolean first=TRUE;
   int w;
   CSTree p,q;
   VertexType v1,w1;
   visited[v]=TRUE;
   strcpy(v1,GetVex(G,v));
   for(w=FirstAdjVex(G,v1);w>=0;w=NextAdjVex(G,v1,strcpy(w1,GetVex(G,w)))) // w依次为v的邻接顶点
     if(!visited[w]) // w顶点不曾被访问
     {
       p=(CSTree)malloc(sizeof(CSNode)); // 分配孩子结点
       strcpy(p->data,GetVex(G,w));
       p->firstchild=NULL;
       p->nextsibling=NULL;
       if(first)
       { // w是v的第一个未被访问的邻接顶点
         T->firstchild=p;
         first=FALSE; // 是根的第一个孩子结点
       }
       else // w是v的其它未被访问的邻接顶点
	 q->nextsibling=p; // 是上一邻接顶点的兄弟姐妹结点
       q=p;
       DFSTree(G,w,q); // 从第w个顶点出发深度优先遍历图G,建立子生成树q
     }
 }
Ejemplo n.º 6
0
/**
 * 算法7.7,建立无向图G的深度优先生成森林的孩子兄弟链表
 */
Status DFSForst(ALGraph G, CSTree &T, bool visited[])
{
	int v;
	CSTree p, q;
	T = NULL;
	for (v = 0; v < G.vexnum; v++) {
		visited[v] = false;
	}
	for (v=0; v < G.vexnum; v++) {
		if (!visited[v]) {
			p = (CSTree) malloc (sizeof(CSNode));
			if (!p)
				return ERROR;
			p->data = GetVex(G, v);
			p->lchild = NULL;
			p->nextsibling = NULL;
			if (!T) {	//是第一棵生成树的根
				T = p;
			} else {
				q->nextsibling = p;
			}
			q = p;
			DFSTree(G, v, p, visited);
		}
	}
	return OK;
}
Ejemplo n.º 7
0
/**
 * 算法7.8,从第v个顶点出发深度优先遍历图G,建立以T为根的生成树
 */
Status DFSTree(ALGraph G, int v, CSTree T, bool visited[])
{
	bool first;
	CSTree p, q;
	int w;
	visited[v] = true;
	first = true;
	for (w = FirstAdjVex(G, v); w >= 0; w = NextAdjVex(G, v, w)) {
		if (!visited[w]) {
			p = (CSTree) malloc (sizeof(CSNode));		//分配孩子结点
			if (!p) {
				return ERROR;
			}
			p->data = GetVex(G, w);
			p->lchild = NULL;
			p->nextsibling = NULL;
			if (first) {
				T->lchild = p;
				first = false;
			} else {
				q->nextsibling = p;
			}
			q = p;
			DFSTree(G, w, q, visited);
		}
	}
	return OK;
}
Ejemplo n.º 8
0
void DFSForest(ALGraph G, CSTree &T)
{
	// 建立无向图G的深度优先生成森林的(最左)孩子(右)兄弟链表T。算法7.7
	CSTree p, q; //孩子兄弟树p、q
	int v;

	T = NULL;

	for (v=0; v<G.vexnum; ++v)
		visited[v] = FALSE; // 赋初值

	for (v=0; v<G.vexnum; ++v) // 从第0个顶点找起
		if (!visited[v]) // 第v个顶点不曾被访问
		{
			// 第v顶点为新的生成树的根结点
			p = (CSTree) malloc(sizeof (CSNode)); // 分配根结点

			p->data=GetVex(G, v); //当前顶点(第v个)拷贝到新分配的根结点
			p->firstchild = NULL;
			p->nextsibling = NULL;

			if (!T) // 如果孩子兄弟树T为空,表示是第一棵生成树的根(T的根)
				T = p; //所以T取新分配的根结点
			else // 如果孩子兄弟树T不为空,表示是其它生成树的根(前一棵的根的“兄弟”)
				q->nextsibling = p; //令前一棵的根的“兄弟”取新分配的根结点

			q = p; // q取当前生成树的根
			DFSTree(G, v, p); // 从第v顶点出发建立以p为根的生成树
		}
}
Ejemplo n.º 9
0
 void DFSForest(ALGraph G,CSTree &T)
 { // 建立无向图G的深度优先生成森林的(最左)孩子(右)兄弟链表T。算法7.7
   CSTree p,q;
   int v;
   T=NULL;
   for(v=0;v<G.vexnum;++v)
     visited[v]=FALSE; // 赋初值,visited[]在bo7-2.cpp中定义
   for(v=0;v<G.vexnum;++v) // 从第0个顶点找起
     if(!visited[v]) // 第v个顶点不曾被访问
     { // 第v顶点为新的生成树的根结点
       p=(CSTree)malloc(sizeof(CSNode)); // 分配根结点
       strcpy(p->data,G.vertices[v].data);
       p->firstchild=NULL;
       p->nextsibling=NULL;
       if(!T) // 是第一棵生成树的根(T的根)
         T=p;
       else // 是其它生成树的根(前一棵的根的"兄弟")
	 q->nextsibling=p; // 第1次不通过此处,以后q已赋值
       q=p; // q指示当前生成树的根
       DFSTree(G,v,p); // 建立以p为根的生成树
     }
 }
Ejemplo n.º 10
0
void DFSForest(Graph G, CSTree &T)
{
	CSTree p, q;
	int v;

	T = NULL;
	for (v = 0; v < G.vexnum; ++v)
		visited[v] = FALSE;
	for (v = 0; v < G.vexnum; ++v)
		if (!visited[v]) {
			p = (CSTree)malloc(sizeof(CSNode));
			p->data = GetVex(G, v);
			p->firstchild = NULL;
			p->nextsibling = NULL;
			if (!T)
				T = p;
			else
				q->nextsibling = p;
			q = p;
			DFSTree(G, v, p);
		}
}
Ejemplo n.º 11
0
 void DFSForest(ALGraph G,CSTree *T)
 { /* 建立无向图G的深度优先生成森林的(最左)孩子(右)兄弟链表T。算法7.7 */
   CSTree p,q;
   int v;
   *T=NULL;
   for(v=0;v<G.vexnum;++v)
     visited[v]=FALSE; /* 赋初值 */
   for(v=0;v<G.vexnum;++v) /* 从第0个顶点找起 */
     if(!visited[v])
     { /* 第v顶点为新的生成树的根结点 */
       p=(CSTree)malloc(sizeof(CSNode)); /* 分配根结点 */
       strcpy(p->data,*GetVex(G,v));
       p->firstchild=NULL;
       p->nextsibling=NULL;
       if(!*T) /* 是第一棵生成树的根(T的根) */
         *T=p;
       else /* 是其它生成树的根(前一棵的根的"兄弟") */
         q->nextsibling=p;
       q=p; /* q指示当前生成树的根 */
       DFSTree(G,v,&p); /* 建立以p为根的生成树 */
     }
 }
Ejemplo n.º 12
0
 void DFSTree(ALGraph G,int v,CSTree &T)
 { // 从第v个顶点出发深度优先遍历图G,建立以T为根的生成树。算法7.8
   Boolean first=TRUE;
   int w;
   CSTree p,q;
   visited[v]=TRUE;
   for(w=FirstAdjVex(G,G.vertices[v].data);w>=0;w=NextAdjVex(G,G.vertices[v].data,G.vertices[w].data)) // w依次为v的邻接顶点
     if(!visited[w]) // w顶点不曾被访问
     {
       p=(CSTree)malloc(sizeof(CSNode)); // 分配孩子结点
       strcpy(p->data,G.vertices[w].data);
       p->firstchild=NULL;
       p->nextsibling=NULL;
       if(first)
       { // w是v的第一个未被访问的邻接顶点
         T->firstchild=p;
         first=FALSE; // 是根的第一个孩子结点
       }
       else // w是v的其它未被访问的邻接顶点
	 q->nextsibling=p; // 是上一邻接顶点的兄弟姐妹结点(第1次不通过此处,以后q已赋值)
       q=p;
       DFSTree(G,w,q); // 从第w个顶点出发深度优先遍历图G,建立子生成树q
     }
 }
Ejemplo n.º 13
0
void DFSTree(Graph G, int v, CSTree &T)
{
	Boolean first = TRUE;
	int w;
	CSTree p, q;

	visited[v] = TRUE;
	for (w = FirstAdjVex(G, v); w >= 0; w = NextAdjVex(G, v, w))
		if (!visited[w]) {
			p = (CSTree)malloc(sizeof(CSNode));
			p->data = GetVex(G, w);
			p->firstchild = NULL;
			p->nextsibling = NULL;
			if (first) {
				T->firstchild = p;
				first = FALSE;
			} else {
				q->nextsibling = p;
			}

			q = p;
			DFSTree(G, w, q);
		}
}
Ejemplo n.º 14
0
void DFSTree(ALGraph G, int v, CSTree &T)
{
	// 从第v个顶点出发深度优先遍历图G,建立以T为根的生成树。算法7.8
	Boolean first = TRUE;
	int w;
	CSTree p, q; //孩子兄弟树p、q
	VertexType v1, w1;

	visited[v] = TRUE;
	v1=GetVex(G, v); //顶点v1序号为v

// w依次为v的邻接顶点
//w初始化为v1第一个邻接点序号
//只要w大于等于0,就执行循环体
//循环体完毕,w取v1的(相对于w1(序号w)的)下一个邻接顶点的序号,准备下轮循环
	for (w=FirstAdjVex(G,v1); w>=0; w=NextAdjVex(G,v1,w1=GetVex(G,w)))
		if (!visited[w]) // w顶点不曾被访问
		{
			p = (CSTree) malloc(sizeof (CSNode)); // 分配新孩子结点

			p->data=GetVex(G, w); //v的当前邻接顶点复制到新结点
			p->firstchild = NULL;
			p->nextsibling = NULL;

			if (first) // w是v的第一个未被访问的邻接顶点
			{
				T->firstchild = p; //树T的长子取新结点
				first = FALSE; // 长子标志置假
			}
			else // w是v的其它未被访问的邻接顶点,是上一邻接顶点的兄弟结点
				q->nextsibling = p; // 上一邻接顶点的兄弟结点取新结点

			q = p; //q取新结点
			DFSTree(G, w, q); // 从第w个顶点出发深度优先遍历图G,递归建立以q为根的子生成树
		}
}