int main(int argc, char **argv) { int i,j; MGraph g; ALGraph *G; int A[MAXV][6] = { { 0, 5, 0, 7, 0, 0}, { 0, 0, 4, 0, 0, 0}, { 8, 0, 0, 0, 0, 9}, { 0, 0, 5, 0, 0, 6}, { 0, 0, 0, 5, 0, 0}, { 3, 0, 0, 0, 1, 0}}; g.n = 6; g.e = 10; for (i = 0; i < g.n; i++) for (j = 0;j < g.n; j++) g.edges[i][j] = A[i][j]; G = (ALGraph *)malloc(sizeof(ALGraph)); MatToList(g,G); printf("1:\n"); DispAdj(G); printf("2:\n"); DFS(G,0); printf("\n"); printf("3:\n"); DFS1(G,0); printf("4:\n"); BFS(G,0); printf("\n"); return 0; }
void DFSTraverse(AdjGraph G) //先深搜索一邻接表表示的图G;而以邻接矩阵表示G时,算法完全相同. { int i , count = 1; for ( i = 0; i < G.n; i++ ) visited [i] =FALSE; //标志数组初始化 for ( i = 0; i < G.n; i++ ) if ( ! visited[i] ) DFS1( &G, i+1 ); //从顶点i 出发开始搜索search() DFSX(G, i ) }
TricComp::TricComp (const Graph& G) : m_ESTACK(G.numberOfEdges()) { m_pGC = new GraphCopySimple(G); GraphCopySimple &GC = *m_pGC; const int n = GC.numberOfNodes(); const int m = GC.numberOfEdges(); #ifdef TRIC_COMP_OUTPUT cout << "Dividing G into triconnected components.\n" << endl; cout << "n = " << n << ", m = " << m << endl << endl; #endif m_component = Array<CompStruct>(3*m-6); m_numComp = 0; // special cases OGDF_ASSERT(n >= 2); OGDF_ASSERT_IF(dlExtendedChecking, isBiconnected(G)); if (n <= 2) { OGDF_ASSERT(m >= 3); CompStruct &C = newComp(); edge e; forall_edges(e,GC) C << e; C.m_type = bond; return; } m_TYPE.init(GC,unseen); splitMultiEdges(); // initialize arrays m_NUMBER.init(GC,0); m_LOWPT1.init(GC); m_LOWPT2.init(GC); m_FATHER.init(GC,0); m_ND .init(GC); m_DEGREE.init(GC); m_TREE_ARC.init(GC,0); m_NODEAT = Array<node>(1,n); m_numCount = 0; m_start = GC.firstNode(); DFS1(GC,m_start,0); edge e; forall_edges(e,GC) { bool up = (m_NUMBER[e->target()] - m_NUMBER[e->source()] > 0); if ((up && m_TYPE[e] == frond) || (!up && m_TYPE[e] == tree)) GC.reverseEdge(e); }
void DFS1 (AdjGraph* G, int i)//以vi为出发点时对邻接表表示的图G进行先深搜索 { static int count=0; EdgeNode *p; cout<<G->vexlist[i].vertex; //访问顶点vi; visited[i]=TRUE; //标记vi已访问 dfn[i]=count++; //对vi进行编号 p=G->vexlist[i].firstedge; //取vi边表的头指针 while( 1 ) //依次搜索vi的邻接点vj, 这里j=p->adjvex { if( !visited[p->adjvex] ) //若vj尚未访问 DFS1(G, p->adjvex); //则以vj为出发点先深搜索 p=p->next; if(p==NULL) break; } } //DFS1