Пример #1
0
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 )
}
Пример #3
0
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