找出图中的所有连通子图(创建图的邻接表,深度优先遍历查找子图)

来源:互联网 发布:杨辉三角居中c语言程序 编辑:程序博客网 时间:2024/05/20 09:07
/* 利用深度优先遍历,找出图中的所有连通图(子图) * 图用邻接表表示 *graph[], 利用边的信息来创建adjacency lists */#include<stdio.h>#include<stdlib.h>#define MAXVERTICES20#define MAXEDGES20typedef enum {FALSE,TRUE,TRISTATE} bool;typedef struct node{int dst;struct node *next;}node_t;/* print graph in adjacency lists */void printGraph(node_t *graph[], int nvert){int i, j;for(i=0; i<nvert; i++){node_t *ptr;printf("node %d: ", i);for(ptr = graph[i]; ptr; ptr=ptr->next)printf("[%d]", ptr->dst);putchar('\n');}}/*****************************find all connected components****************************************//* 头插法创建邻接表(没有单独的头节点,只有一个头指针,即指针数组) *//* 此处因为头指针会改变,所以要传入指针的指针 *//* @ptr: adjacency list head (*graph[])  * @dst: 待插入的节点(在graph中index) */void insertEdge(node_t **ptr, int dst){node_t *newnode = (node_t *)malloc(sizeof(node_t));newnode->dst = dst;newnode->next = *ptr;*ptr = newnode;}/* build adjacency lists for graph according to edges *//* graph[]: adjacency lists head */void buildGraph(node_t *graph[], int edges[2][MAXEDGES], int nedges){int i;for(i=0; i<nedges; i++){insertEdge(graph+edges[0][i], edges[1][i]);insertEdge(graph+edges[1][i], edges[0][i]);}}/* depth-first traverse */void dfs(int v, int *visited, node_t *graph[] ){node_t *ptr;visited[v] = TRISTATE;for(ptr=graph[v]; ptr; ptr=ptr->next)if(visited[ptr->dst] == FALSE)dfs(ptr->dst, visited, graph);}void printSetTriState(int *visited, int nvert){int i;for(i=0; i<nvert; i++)if(visited[i] == TRISTATE){printf("%d ", i);visited[i] = TRUE;}printf("\n\n");}/* print all connected components of graph represented using INC lists *//* @method:  从第一个节点开始深度遍历节点,当仍然有未被访问的节点时, * 说明该节点属于另一个图,所以再以该节点为起点,深度遍历,则可找出另一个图 */void compINC(node_t *graph[], int nvert){int *visited;int i;visited = (int *)malloc(nvert * sizeof(int)); for(i=0; i<nvert; ++i )        visited[i] = FALSE;for(i=0; i<nvert; i++)if(visited[i] == FALSE){dfs(i, visited, graph);printSetTriState(visited, nvert);}free(visited);}main(void){    /* 根据边的信息来创建adjacency lists */int edges[][MAXEDGES] = { {0,2,4,5,5,4 },{1,1,3,4,6,6} };int nvert = 7;int nedges = 6;node_t **graph = (node_t **)calloc(nvert, sizeof(node_t *));buildGraph(graph, edges, nedges);printGraph(graph, nvert);printf("All connected components (sub-graphs): \n");compINC(graph, nvert);return 0;}