数据结构与算法 - 图论

题型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); } } } } } }

《数据结构与算法 - 图论》

    原文作者:算法小白
    原文地址: https://www.cnblogs.com/alantu2018/p/8460832.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞