//1、访问v,s【v】置位;2、取v的第一临界点u
//3、若u>=0,转4,否则退出;4、若u未访问则DFS(matrix,s,u)
//再访问下一个节点,u = vnextadj(matrix,s,u);再转3.
void DFS(int matrix[N][N],int s[],int v)//深度优化搜索。
{
	int u;
	printf("V%d ",v);
	s[v]=1;
	u = firstadj(matrix,v);
	while(u>=0)
	{
		if(s[u]!=1)
		{
			DFS(matrix,s,u);
		}
		u=nextadj(matrix,v,u);
	}
}
Beispiel #2
0
void _DFS(mgraph *mg, int v) {
	int u;
	static int visited[MAXN] = {0};

	printf("%s ", mg->vertex[v]);
	visited[v] = 1;

	u = firstadj(mg, v);
	while (u != -1) {
		if (!visited[u]) {
			_DFS(mg, u);
		}
		u = nextadj(mg, v, u);
	}
}
Beispiel #3
0
int main(int argc, const char *argv[])
{
	char * 	v[N] = {"V0", "V1", "V2", "V3", "V4", "V5", "V6", "V7", "V8"};
    int edge[N][N]={   //v0 v1 v2 v3 v4 v5 v6 v7 v8
                 /*v0*/ {0, 1, 1, 0, 0, 0, 0, 0, 0},
                 /*v1*/ {1, 0, 0, 1, 0, 1, 0, 0, 0},
                 /*v2*/ {1, 0, 0, 0, 0, 0, 1, 1, 0},
                 /*v3*/ {0, 1, 0, 0, 1, 0, 0, 0, 0},
                 /*v4*/ {0, 0, 0, 1, 0, 1, 0, 0, 1},
                 /*v5*/ {0, 1, 0, 0, 1, 0, 0, 0, 0},
                 /*v6*/ {0, 0, 1, 0, 0, 0, 0, 1, 0},
                 /*v7*/ {0, 0, 1, 0, 0, 0, 1, 0, 0},
                 /*v8*/ {0, 0, 0, 0, 1, 0, 0, 0, 0}
    };
	mgraph * mg;

	mg = mgraph_create(N, v, edge);

	//int visited[N] = {0};
	//DFS(mg, 0, visited);
	_DFS(mg, 0);
	puts("");

	_BFS(mg, 0);

	if (topsort(mg)) {
		printf("not cycle\n");
	}
	else {
		printf("cycle\n");
	}

	//int (*p)[N];
//	p = edge;
#if 0
	
	int u = firstadj(mg, 7);//u=1
	printf("%d %s \n", u, v[u]);//1 V1

	u = nextadj(mg, 7, u);//u=2
	printf("%d %s \n", u, v[u]);//1 V1

#endif

	return 0;
}
void BFS(int matrix[N][N],int s[],int v)//对图G从序号V的顶点开始遍历,按BFS遍历;
{
	int u;
	sequeue *sq;
	sq = Createsequeue();//创建队列并置空;
	printf("V%d ",v);//访问V定点,输出;
	s[v]=1;//对v定点置1;
	Ensequeue(sq,v);//v进队列;
	while(!Emptysequeue(sq))//当队列未空时,依次出队,
	{
		v = Desequeue(sq);	
		u=firstadj(matrix,v);//先找到他的第一临接点;
		while(u>=0)//u》=0;表示访问v定点的所有临接点;
		{
			if(!s[u])//判断临节点标志是否为1,如果是找下个临界点;依次遍历
			{
				printf("v%d ",u);
				s[u]=1;
				Ensequeue(sq,u);//有临界点时,访问 置标识1,并进队列~
			}
			u = nextadj(matrix,v,u);//找v定点的下一临界点,
		}
	}
}
Beispiel #5
0
void BFS(mgraph * mg, int v) {
	sequeue * sq;
	int visited[MAXN] = {0}, u;
	
	sq = queue_create();

	printf("%s ", mg->vertex[v]);
	visited[v] = 1;
	enqueue(sq, v);

	while (! queue_empty(sq)) {
		v = dequeue(sq);
		u = firstadj(mg, v);
		while (u != -1) {
			if (!visited[u]) {
				printf("%s ", mg->vertex[u]);
				visited[u] = 1;
				enqueue(sq, u);
			}
			u = nextadj(mg, v, u);
		}
	}
	puts("");
}