图的相关算法

作者: 飞白非白 | 来源:发表于2018-12-04 11:20 被阅读2次
    • 深度优先搜索非递归形式 DFS
    Boolean visited[MAX]; //标志数组 
    Status (*VisitFunction)(int v); //访问函数
     
    void DFSTraverse(Graph G, Status (*Visit)(int v))
    {
        VisitFunction = Visit;
        for(v = 0; v < G.vexnum; ++v) //初始化标志数组
            visited[v] = false;
        for(v = 0; v < G.vexnum; ++v) //对未访问过的顶点调用DFS
            if(!visited[v])
                DFS(G, v);
    }
     
    void DFS(Graph G, int v) //从顶点v出发进行DFS
    {
        visited[v] = true;
        VisitFunction(v);
        for(w = FirstAdjVex(G, v); w >= 0; w = NextAdjVex(G, v, w))
            if(!visited[w])
                DFS(G, w); //递归调用未访问的邻接顶点w
    }
    
    • 深度优先搜索非递归形式
    N_DFS(gragh g, int i){
        int j;
        seqstack s;
        INITSTACK(s);
        while(!EMPTY(s)){
            if(visited[i] == 0){
                visited[i] = 1;
                printf(g.vexs[i]);
            }
            for(j = 0; j != n;++j)
                if((g.arcs[i][j] == 1) && (!visited[j])){
                    PUSH(s,j);
                    i = j;
                    break;
                }
                else{
                    POP(s);
                    i = GETTOP(s);
                }
        }
    }
    
    • 广度优先搜索 BFS
    void BFSTraverse(Graph G, Status (*Visit)(int v))
    {
        for(v = 0; v < G.vexnum; ++v)
            visited[v] = false;   
        InitQueue(Q);
        for(v = 0; v < G.vexnum; ++v)
            if(!visited[v])
            {
                visited[v] = true;
                Visit(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] = true;
                            visit(w);
                            EnQueue(Q, w);
                        }
                }
            }
    }
    
    • 判断无向图是否是树
     int IsTree(AdjGraph *G)
    {
        int vNum=0,eNum=0,i;
        for(i=0;i<G->vexnum;i++)
            visited[i]=0;
        DFS(G,0,&vNum,&eNum);
        if(vNum==G->vexnum && eNum==2*(G->vexnum-1))
            return 1;
        else
            return 0;
    }
    void DFS(AdjGraph *G,int v,int *vNum,int *eNum)
    {
        ArcNode *p;
        visited[v]=1;
        (*vNum)++;
        p=G->vertex[v].firstarc;
        while(p!=NULL)
        {
            (*eNum)++;
            if(visited[p->adjvex]==0)
                DFS(G,p->adjvex,vNum,eNum);
            p=p->nextarc;
        }
    }
    
    • 判断有向图中两个顶点是否存在长度为K的路径
    int visited[MAXSIZE]
    //出发点为i,终点为j,长度为k 
    int exist_path_len(ALGraph G,int i,int j,int k) 
    {
        if(i==j&&k==0)
            return 1;
        else if(k>0)
        {
            visited[i]=1;
            for(p=G.vertices[i].firstarc;p;p=p->nextarc)
            {
                int temp=p->adjvex;
                if(!visited[temp]&&exist_path_len(temp,j,k-1))
                    return 1; 
            } 
            visited[i]=0;
       //这里需要把已经访问的点重新置为0,因为如果当前不存在长度为k
       //到达j点,那么这个点还是可以使用的,因为有可能从其他点出口
       //可以到达j点并且长度为k 
        } 
        return 0;
    } 
    
    
    

    相关文章

      网友评论

        本文标题:图的相关算法

        本文链接:https://www.haomeiwen.com/subject/nzkmcqtx.html