//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); } }
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); } }
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定点的下一临界点, } } }
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(""); }