数据结构与算法 - 图论
题型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);
}
}
}
}
}
}