第十二周--项目4应用图的深度优先遍历思路求解问题 (3)(4)

原创 2015年11月18日 20:25:57
<img src="http://img.blog.csdn.net/20151118203159541?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />*       
 * Copyright (c++) 2015 烟台大学计算机学院       
 * All right reserved.       
 * 文件名称:houzhui.cpp       
 * 作    者: 商文轲       
 * 完成日期:2015年11月日       
 * 版 本 号:v1.9        
 *       

*/          

3、输出所有路径
问题:输出从顶点u到v的所有简单路径。

#include <stdio.h>
#include <malloc.h>
#include "graph.h"
int visited[MAXV];     //定义存放节点的访问标志的全局数组
void FindPaths(ALGraph *G,int u,int v,int path[],int d)
//d是到当前为止已走过的路径长度,调用时初值为-1
{
    int w,i;
    ArcNode *p;
    visited[u]=1;
    d++;            //路径长度增1
    path[d]=u;              //将当前顶点添加到路径中
    if (u==v && d>1)            //输出一条路径
    {
        printf("  ");
        for (i=0; i<=d; i++)
            printf("%d ",path[i]);
        printf("\n");
    }
    p=G->adjlist[u].firstarc; //p指向u的第一条边
    while(p!=NULL)
    {
        w=p->adjvex;     //w为u的邻接顶点
        if (visited[w]==0)      //若顶点未标记访问,则递归访问之
            FindPaths(G,w,v,path,d);
        p=p->nextarc; //找u的下一个邻接顶点
    }
    visited[u]=0;   //恢复环境
}


void DispPaths(ALGraph *G,int u,int v)
{
    int i;
    int path[MAXV];
    for (i=0; i<G->n; i++)
        visited[i]=0; //访问标志数组初始化
    printf("从%d到%d的所有路径:\n",u,v);
    FindPaths(G,u,v,path,-1);
    printf("\n");
}

int main()
{
    ALGraph *G;
    int A[5][5]=
    {
        {0,1,0,1,0},
        {1,0,1,0,0},
        {0,1,0,1,1},
        {1,0,1,0,1},
        {0,0,1,1,0}
    };  //请画出对应的有向图
    ArrayToList(A[0], 5, G);
    DispPaths(G, 1, 4);
    return 0;
}

总结:从1到4的路径就是改变第二个元素分别遍历,遍历后标记,看是否有到4的路径。

4、输出一些简单回路
问题:输出图G中从顶点u到v的长度为s的所有简单路径。

#include <stdio.h>
#include <malloc.h>
#include "graph.h"
int visited[MAXV];     //定义存放节点的访问标志的全局数组
void SomePaths(ALGraph *G,int u,int v,int s, int path[],int d)
//d是到当前为止已走过的路径长度,调用时初值为-1
{
    int w,i;
    ArcNode *p;
    visited[u]=1;
    d++;            //路径长度增1
    path[d]=u;              //将当前顶点添加到路径中
    if (u==v && d==s)           //输出一条路径
    {
        printf("  ");
        for (i=0; i<=d; i++)
            printf("%d ",path[i]);
        printf("\n");
    }
    p=G->adjlist[u].firstarc; //p指向u的第一条边
    while(p!=NULL)
    {
        w=p->adjvex;     //w为u的邻接顶点
        if (visited[w]==0)      //若顶点未标记访问,则递归访问之
            SomePaths(G,w,v,s,path,d);
        p=p->nextarc; //找u的下一个邻接顶点
    }
    visited[u]=0;   //恢复环境
}

void DispSomePaths(ALGraph *G,int u,int v, int s)
{
    int i;
    int path[MAXV];
    for (i=0; i<G->n; i++)
        visited[i]=0; //访问标志数组初始化
    printf("从%d到%d长为%d的路径:\n",u,v,s);
    SomePaths(G,u,v,s,path,-1);
    printf("\n");
}

int main()
{
    ALGraph *G;
    int A[5][5]=
    {
        {0,1,0,1,0},
        {1,0,1,0,0},
        {0,1,0,1,1},
        {1,0,1,0,1},
        {0,0,1,1,0}
    };  //请画出对应的有向图
    ArrayToList(A[0], 5, G);
    DispSomePaths(G, 1, 4, 3);
    return 0;
}


总结:该程序就是问题(3)的基础上增加长度限制,设置一个变量记录路径长度,超过3则不再遍历,用到回溯的思想。



图——应用图的深度优先遍历思路求解问题

/* *Copyright (c) 2015 , 烟台大学计算机学院 *All right resvered . *文件名称: 应用图的深度优先遍历思路求解问题.cpp ...
  • zzh_569754126
  • zzh_569754126
  • 2015年11月22日 11:19
  • 1370

数据结构实践——迷宫问题之图深度优先遍历解法

本文是针对[数据结构基础系列(7):图]的实践项目。【项目 - 迷宫问题之图深度优先遍历解法】   设计一个程序,采用深度优先遍历算法的思路,解决迷宫问题。   (1)建立迷宫对应的图数据结构...
  • sxhelijian
  • sxhelijian
  • 2015年11月08日 15:36
  • 5913

第十二周--项目4应用图的深度优先遍历思路求解问题 (6)(7)

/* * Copyright (c++) 2015 烟台大学计算机学院 * All right reserved. * 文件名称:houzhui.cpp...
  • xiongmaoshang
  • xiongmaoshang
  • 2015年11月23日 16:21
  • 159

第十二周--项目4应用图的深度优先遍历思路求解问题 (5)

* * Copyright (c++) 2015 烟台大学计算机学院 * All right reserved. * 文件名称:houzhui.cpp ...
  • xiongmaoshang
  • xiongmaoshang
  • 2015年11月18日 20:37
  • 155

第十二周--项目4应用图的深度优先遍历思路求解问题 (1)(2)

/* * Copyright (c++) 2015 烟台大学计算机学院 * All right reserved. * 文件名称:houzhui.cpp...
  • xiongmaoshang
  • xiongmaoshang
  • 2015年11月18日 20:15
  • 204

数据结构实践——迷宫问题之图深度优先遍历解法

本文是针对[数据结构基础系列(7):图]的实践项目。 【项目 - 迷宫问题之图深度优先遍历解法】     设计一个程序,采用深度优先遍历算法的思路,解决迷宫问题。     (1)建立迷宫对应...
  • likaiwalkman
  • likaiwalkman
  • 2016年01月29日 03:17
  • 283

图的遍历,非递归版本,深度优先遍历

遍历思路: 将第一个节点压入 stack_node 中, stack_node.back() 表示当前访问的节点。 若存在尚未访问的邻接节点,则将其压入 stack_node 中,标记为已访问,并将...
  • garrison_Z
  • garrison_Z
  • 2015年10月11日 21:58
  • 1576

实验4 无向图的深度优先搜索

实验4 无向图的深度优先搜索 【实验内容】 设无向图G有n个点e条边,写一算法建立无向图G的邻接表,并按照深度优先搜索输出顶点。 【实验目的】 1、了解图的定义、特点,区分无向图和有向图的概念...
  • qq_37497322
  • qq_37497322
  • 2017年12月19日 14:26
  • 111

数据结构:图的遍历--深度优先、广度优先

图的遍历是指从图中的某一顶点出发,按照一定的策略访问图中的每一个顶点。当然,每个顶点有且只能被访问一次。 在图的遍历中,深度优先和广度优先是最常使用的两种遍历方式。这两种遍历方式对无向图和有向图都是适...
  • zhangxiangDavaid
  • zhangxiangDavaid
  • 2014年08月02日 11:20
  • 35219

走迷宫问题(深度优先遍历 + 广度优先遍历)

迷宫是许多小方格构成的矩形,在每个小方格中有的是墙(用1表示),有的是路(用0表示)。走迷宫就是从一个小方格沿上、下、左、右四个方向到邻近的方格,当然不能穿墙。设迷宫的入口是在左上角(1,1),出口是...
  • u011954296
  • u011954296
  • 2016年04月29日 08:54
  • 2685
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:第十二周--项目4应用图的深度优先遍历思路求解问题 (3)(4)
举报原因:
原因补充:

(最多只允许输入30个字)