问题及描述:

#ifndef GRAPH_H_INCLUDED
#define GRAPH_H_INCLUDED  #define MAXV 100                //最大顶点个数
#define INF 32767       //INF表示∞
typedef int InfoType;  //以下定义邻接矩阵类型
typedef struct
{  int no;                     //顶点编号  InfoType info;              //顶点其他信息,在此存放带权图权值
} VertexType;                   //顶点类型  typedef struct                  //图的定义
{  int edges[MAXV][MAXV];      //邻接矩阵  int n,e;                    //顶点数,弧数  VertexType vexs[MAXV];      //存放顶点信息
} MGraph;                       //图的邻接矩阵类型  //以下定义邻接表类型
typedef struct ANode            //弧的结点结构类型
{  int adjvex;                 //该弧的终点位置  struct ANode *nextarc;      //指向下一条弧的指针  InfoType info;              //该弧的相关信息,这里用于存放权值
} ArcNode;  typedef int Vertex;  typedef struct Vnode            //邻接表头结点的类型
{  Vertex data;                //顶点信息  int count;                  //存放顶点入度,只在拓扑排序中用  ArcNode *firstarc;          //指向第一条弧
} VNode;  typedef VNode AdjList[MAXV];    //AdjList是邻接表类型  typedef struct
{  AdjList adjlist;            //邻接表  int n,e;                    //图中顶点数n和边数e
} ALGraph;                      //图的邻接表类型  //功能:由一个反映图中顶点邻接关系的二维数组,构造出用邻接矩阵存储的图
//参数:Arr - 数组名,由于形式参数为二维数组时必须给出每行的元素个数,在此将参数Arr声明为一维数组名(指向int的指针)
//      n - 矩阵的阶数
//      g - 要构造出来的邻接矩阵数据结构
void ArrayToMat(int *Arr, int n, MGraph &g); //用普通数组构造图的邻接矩阵
void ArrayToList(int *Arr, int n, ALGraph *&); //用普通数组构造图的邻接表
void MatToList(MGraph g,ALGraph *&G);//将邻接矩阵g转换成邻接表G
void ListToMat(ALGraph *G,MGraph &g);//将邻接表G转换成邻接矩阵g
void DispMat(MGraph g);//输出邻接矩阵g
void DispAdj(ALGraph *G);//输出邻接表G
//int visited[MAXV];
#endif // GRAPH_H_INCLUDED
#include <stdio.h>
#include <malloc.h>
#include "head.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;
}
#include <stdio.h>
#include <malloc.h>
#include "head.h"  //功能:由一个反映图中顶点邻接关系的二维数组,构造出用邻接矩阵存储的图
//参数:Arr - 数组名,由于形式参数为二维数组时必须给出每行的元素个数,在此将参数Arr声明为一维数组名(指向int的指针)
//      n - 矩阵的阶数
//      g - 要构造出来的邻接矩阵数据结构
void ArrayToMat(int *Arr, int n, MGraph &g)
{  int i,j,count=0;  //count用于统计边数,即矩阵中非0元素个数  g.n=n;  for (i=0; i<g.n; i++)  for (j=0; j<g.n; j++)  {  g.edges[i][j]=Arr[i*n+j]; //将Arr看作n×n的二维数组,Arr[i*n+j]即是Arr[i][j],计算存储位置的功夫在此应用  if(g.edges[i][j]!=0 && g.edges[i][j]!=INF)  count++;  }  g.e=count;
}  void ArrayToList(int *Arr, int n, ALGraph *&G)
{  int i,j,count=0;  //count用于统计边数,即矩阵中非0元素个数  ArcNode *p;  G=(ALGraph *)malloc(sizeof(ALGraph));  G->n=n;  for (i=0; i<n; i++)                 //给邻接表中所有头节点的指针域置初值  G->adjlist[i].firstarc=NULL;  for (i=0; i<n; i++)                 //检查邻接矩阵中每个元素  for (j=n-1; j>=0; j--)  if (Arr[i*n+j]!=0)      //存在一条边,将Arr看作n×n的二维数组,Arr[i*n+j]即是Arr[i][j]  {  p=(ArcNode *)malloc(sizeof(ArcNode));   //创建一个节点*p  p->adjvex=j;  p->info=Arr[i*n+j];  p->nextarc=G->adjlist[i].firstarc;      //采用头插法插入*p  G->adjlist[i].firstarc=p;  }  G->e=count;
}  void MatToList(MGraph g, ALGraph *&G)
//将邻接矩阵g转换成邻接表G
{  int i,j;  ArcNode *p;  G=(ALGraph *)malloc(sizeof(ALGraph));  for (i=0; i<g.n; i++)                   //给邻接表中所有头节点的指针域置初值  G->adjlist[i].firstarc=NULL;  for (i=0; i<g.n; i++)                   //检查邻接矩阵中每个元素  for (j=g.n-1; j>=0; j--)  if (g.edges[i][j]!=0)       //存在一条边  {  p=(ArcNode *)malloc(sizeof(ArcNode));   //创建一个节点*p  p->adjvex=j;  p->info=g.edges[i][j];  p->nextarc=G->adjlist[i].firstarc;      //采用头插法插入*p  G->adjlist[i].firstarc=p;  }  G->n=g.n;  G->e=g.e;
}  void ListToMat(ALGraph *G,MGraph &g)
//将邻接表G转换成邻接矩阵g
{  int i,j;  ArcNode *p;  g.n=G->n;   //根据一楼同学“举报”改的。g.n未赋值,下面的初始化不起作用  g.e=G->e;  for (i=0; i<g.n; i++)   //先初始化邻接矩阵  for (j=0; j<g.n; j++)  g.edges[i][j]=0;  for (i=0; i<G->n; i++)  //根据邻接表,为邻接矩阵赋值  {  p=G->adjlist[i].firstarc;  while (p!=NULL)  {  g.edges[i][p->adjvex]=p->info;  p=p->nextarc;  }  }
}  void DispMat(MGraph g)
//输出邻接矩阵g
{  int i,j;  for (i=0; i<g.n; i++)  {  for (j=0; j<g.n; j++)  if (g.edges[i][j]==INF)  printf("%3s","∞");  else  printf("%3d",g.edges[i][j]);  printf("\n");  }
}  void DispAdj(ALGraph *G)
//输出邻接表G
{  int i;  ArcNode *p;  for (i=0; i<G->n; i++)  {  p=G->adjlist[i].firstarc;  printf("%3d: ",i);  while (p!=NULL)  {  printf("-->%d/%d ",p->adjvex,p->info);  p=p->nextarc;  }  printf("\n");  }
}  

运行结果:

第12周 项目4-输出从顶点u到v的所有简单路径相关推荐

  1. 4.6设计一个算法判断图G中从顶点u到v是否存在简单路径

    1. 题目描述 假设图G采用邻接表存储,设计一个算法判断图G中从顶点u到v是否存在简单路径 所谓简单路径是指路径上的顶点不重复.可采用深度优先遍历的方法 #include <bits/stdc+ ...

  2. 输出从顶点Vi到Vj的所有简单路径

    class Solution {public:bool visited[20];void init(){for(int i=0;i<20;i++)visited[i]=false;}int fi ...

  3. 【数据结构】-图-输出顶点u到v的所有简单路径

    简单路径:路径上没有重复节点--深度搜索 思路:一步一步递归向下走,以下面这个图为例,详细的递归过程如下所示: 编程注意事项: 1.path数组少为开大一点,避免越界 2.一定记得返回之前要把visi ...

  4. 图10——判断顶点u和顶点v是否存在简单路径

    已有邻接表表示的有向图,编程判断从顶点u到顶点v是否存在简单路径若有,则打印出该路径上的顶点.要求先描述图中的存储结构,并简述算法思路:查找邻接顶点等图运算要自己实现(尽量采用非递归算法) [分析] ...

  5. C++第12周项目6——太乐了!

    课程首页地址:http://blog.csdn.net/sxhelijian/article/details/7910565 [项目6-泰勒展开] 先听故事,再编程序.故事是这样的:话说sin和cos ...

  6. 第三周项目三-输出星号图(4)

    /* *Copyright(c)2016,烟台大学计算机与控制工程学院 *All rights reserved *文件名称:123.cpp *作 者:王蕊 *完成日期:2016年3月15日 *版 本 ...

  7. 第三周项目三-输出星号图(3)

    /**Copyright(c)2016,烟台大学计算机与控制工程学院*All rights reserved*文件名称:123.cpp*作 者:王蕊*完成日期:2016年3月13日*版 本 号:v1. ...

  8. 第三周项目三-输出星号图(2)

    /**Copyright(c)2016,烟台大学计算机与控制工程学院*All rights reserved*文件名称:123.cpp*作 者:王蕊*完成日期:2016年3月13日*版 本 号:v1. ...

  9. 第三周项目三-输出星号图(1)

    /**Copyright(c)2016,烟台大学计算机与控制工程学院*All rights reserved*文件名称:123.cpp*作 者:王蕊*完成日期:2016年3月13日*版 本 号:v1. ...

最新文章

  1. 浅谈HTTP中Get与Post的区别
  2. plot参数详解python_30行Python代码实现3D数据可视化
  3. 晒晒一个多月的seo小成就
  4. Jquery中设置表格的悬浮和选中时行的背景颜色
  5. 【转】新浪微博手机客户端刷新都是手动刷新或者下拉刷新,为什么不设计成自动刷新?...
  6. C语言字符串数字提取函数,支持负数、浮点数、科学记数法
  7. Android 文件的上传
  8. 3.2存储器层次结构
  9. 启用RHEL5.6的VNC,使Windows可图形远程控制
  10. can卡、usbcan、can分析仪通用测试软件LCANTest详细介绍
  11. 【VISIO2016箭头使用】
  12. 食品和饮料销售预测分析
  13. 千挂科技与东风柳汽达成前装量产合作,2024年交付自动驾驶牵引车
  14. python 补获按键_qpython可以捕获耳机按键吗?
  15. 笔记 09-集合(HashSet HashMap TreeMap) 练习
  16. 新浪小编为您介绍留声机的古与今
  17. 孙溟㠭绘画篆刻——《梦》
  18. 安迪的第一个字典Uva 10815
  19. 编译原理实验 -- 文法分析
  20. Java程序员为何收入比其他行业收入高?原因是什么呢?

热门文章

  1. 文献笔记:Contrast-Phys: Unsupervised Video-based Remote Physiological Measurement viaSpatiotemporal Con
  2. 汇承金融科技:开创多渠道资产与资金撮合融资服务模式
  3. 通俗易懂【Springboot】 单文件下载和批量下载(多个文件合成一个压缩包下载)
  4. 产品分析 淘宝、京东、平多多
  5. qt linux不能读写u盘文件,Qt读取U盘文件内容
  6. .htaccess rewrite 规则详细说明
  7. 德州市德城区农产品区域公用品牌“尚德诚品”正式发布
  8. Java毕业设计_基于javaee创新创业实验室管理系统
  9. php:获取字符串的长度
  10. Mathematica绘制图形