码迷,mamicode.com
首页 > 编程语言 > 详细

数据结构与算法——图论

时间:2015-03-28 01:04:03      阅读:117      评论:0      收藏:0      [点我收藏+]

标签:

题型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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!