在算法实现方面要求,熟练掌握图的两种遍历方法,
DFSTraverse(G, v, Visit());
//从顶点v起深度优先遍历图G,并对每个顶点调用函数Visit一次且仅一次。
void DFS( ALGraph *G , int v )//用邻接表实现,遍历图G中与顶点v相连的顶点
{ LinkNode *p ;
Visited[v] = TRUE ; // 置访问标志,
visit(v) ; //访问顶点v
p = G->AdjList[v].firstarc; //链表的第一个结点
while ( p != NULL )
{ if ( !Visited[p->adjvex] )
DFS( G, p->adjvex ) ;
p = p->nextarc ;//从v的未访问过的邻接顶点出发深度优先搜索
}
}
void DFS_traverse_Graph(ALGraph *G)//遍历图G
{ int v ;
for ( v=0 ; v<G->vexnum ; v++ )
Visited[v] = FALSE ; //访问标志初始化
for ( v=0 ; v<G->vexnum ; v++ )
if ( !Visited[v] ) DFS( G , v );
}
BFSTraverse(G, v, Visit());
//从顶点v起广度优先遍历图G,并对每
//个顶点调用函数Visit一次且仅一次。
void BFS_traverse_Grapg(ALGraph *G)
{ int k ,v , w ;
LinkNode *p ; Queue *Q ; Q = (Queue *)malloc(sizeof(Queue)) ;
Q->front = Q->rear = 0; //建立空队列并初始化
for (k=0 ; k<G->vexnum ; k++)
Visited[k]=FALSE ; //访问标志初始化
for (k=0 ; k<G->vexnum ; k++)
{ v = G->AdjList[k].data ; //单链表的头顶点
if ( !Visited[v] ) //v尚未访问
{ Q->elem[++Q->rear] = v ; //v入队
while (Q->front != Q->rear) //1 队列非空时
{ w = Q->elem[++Q->front];//队首元素出队
Visited[w] = TRUE ; //置访问标志
Visit(w) ; //访问队首元素
p = G->AdjList[w].firstarc;
while ( p != NULL ) //2 找出队元素的下一个邻接点
{ if ( !Visited[p->adjvex] )
Q->elem[++Q->rear] = p->adjvex;//邻接点入队
p = p->nextarc ;
}// end while 2
} // end while 1
} //end if 1
} //end for 2
}
并能够根据图的基本原理解决一些应用问题,常考简答计算题:
判定图的连通性:最小生成树
(1) 统计各顶点入度的函数
void count_indegree(ALGraph *G)
{ int k ; LinkNode *p ;
for (k=0; k<G->vexnum; k++)
G->adjlist[k].indegree=0 ; /* 顶点入度初始化 */
for (k=0; k<G->vexnum; k++)
{ p=G->adjlist[k].firstarc ;
while (p!=NULL) /* 顶点入度统计 */
{ G->adjlist[p->adjvex].indegree++ ;
p=p->nextarc ;
}
}
}
判定是否有环:拓扑排序,拓扑序列
(2) 拓扑排序算法
int Topologic_Sort(ALGraph *G, int topol[])
/* 顶点的拓扑序列保存在一维数组topol中 */
{ int k, no, vex_no, top=0, count=0, boolean=1 ;
int stack[MAX_VEX] ; /* 用作堆栈 */
LinkNode *p ;
count_indegree(G) ; /* 统计各顶点的入度 */
for (k=0; k<G->vexnum; k++)
if (G->adjlist[k].indegree==0)
stack[++top]=G->adjlist[k].data ;
do
{ if (top==0) boolean=0 ;
else
{ no=stack[top--] ; /* 栈顶元素出栈 */
topl[++count]=no ; /* 记录顶点序列 */
p=G->adjlist[no].firstarc ;
while (p!=NULL) /*删除以顶点为尾的弧*/
{ vex_no=p->adjvex ;
G->adjlist[vex_no].indegree-- ;
if (G->adjlist[vex_no].indegree==0)
stack[++top]=vex_no ;
p=p->nextarc ;
}
}
}while(boolean==0) ;
if (count<G->vexnum) return(-1) ;
else return(1) ;
}