题型1:拓扑排序
1)使用一个入度数组indegree来记录每个顶点的入度数,并使用一个变量来记录已经访问的顶点数
2)将入度为0的顶点压入栈中
3)将栈顶的元素删除。访问的顶点数加1.并将入该顶点相邻的所有顶点的入度数减1,如果减1之后的入度数为0,则将其压入栈中;
4)重复上面的过程,直到栈中的元素为空。
5)判读访问的顶点数是否等于图的顶点数,看拓扑排序是否成功
实现代码:
status TopoLogicalSort(ALGraph G) { //有向图G采用邻接表存储结构 //若G无回路,则返回G的顶点的一个拓扑序列并返回OK,否则返回error finddegree(G,indegree); initstack(s); for(i=0;i<G.vexnum;++i) if(!indegree[i]) push(s,i); count=0; while(!stackempty(s)) { pop(s,i); cout<<s<<‘ ‘; ++count; for(p=G.vetices[i].furstarc;p;p=p->next) { k=p->adjvex; if(!(--indegree[k])) push(s,k); } } if(count<G.vexnum) cout<<error<<endl; else cout<<success<<endl; }
2 深度优先遍历
int visited[N]; void DFS(Graph G,int v) { visited[v]=1; cout<<v<<‘ ‘; for(w=firstAdjVex(G,v),w>=0;w=NextAdjVex(G,v,w)) { if(!visited[w]) DFS(G,w); } } void DFSsearch(Graph G) { for(v=0;v<G.vexnum;++v) vistied[v]=0; for(v=0;v<G.vexnum;++v) DFS(G,v); }
3 广度优先遍历
int visited[N]; void BFSsearch(Graph G) { for(v=0;v<G.vexnum;++v) visited[v]=0; Initqueue(Q); for(v=0;v<G.vexnum;v++) { if(!visited[v]) { visited[v]=1; cout<<v<<‘ ‘; Enqueue(Q,v); while(!QueueEmpty(Q)) { DeQueue(Q,u); for(w=FirstAdjVex(G,u);w>=0;w=NextAdjVex(G,u,w)) { if(!visited[w]) { visited[w]=1; cout<<w<<‘ ‘; EnQueue(Q,w); } } } } } }
原文:http://www.cnblogs.com/wuchanming/p/4373391.html