第12周 项目4-输出从顶点u到v的所有简单路径
问题及描述:
#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的所有简单路径相关推荐
- 4.6设计一个算法判断图G中从顶点u到v是否存在简单路径
1. 题目描述 假设图G采用邻接表存储,设计一个算法判断图G中从顶点u到v是否存在简单路径 所谓简单路径是指路径上的顶点不重复.可采用深度优先遍历的方法 #include <bits/stdc+ ...
- 输出从顶点Vi到Vj的所有简单路径
class Solution {public:bool visited[20];void init(){for(int i=0;i<20;i++)visited[i]=false;}int fi ...
- 【数据结构】-图-输出顶点u到v的所有简单路径
简单路径:路径上没有重复节点--深度搜索 思路:一步一步递归向下走,以下面这个图为例,详细的递归过程如下所示: 编程注意事项: 1.path数组少为开大一点,避免越界 2.一定记得返回之前要把visi ...
- 图10——判断顶点u和顶点v是否存在简单路径
已有邻接表表示的有向图,编程判断从顶点u到顶点v是否存在简单路径若有,则打印出该路径上的顶点.要求先描述图中的存储结构,并简述算法思路:查找邻接顶点等图运算要自己实现(尽量采用非递归算法) [分析] ...
- C++第12周项目6——太乐了!
课程首页地址:http://blog.csdn.net/sxhelijian/article/details/7910565 [项目6-泰勒展开] 先听故事,再编程序.故事是这样的:话说sin和cos ...
- 第三周项目三-输出星号图(4)
/* *Copyright(c)2016,烟台大学计算机与控制工程学院 *All rights reserved *文件名称:123.cpp *作 者:王蕊 *完成日期:2016年3月15日 *版 本 ...
- 第三周项目三-输出星号图(3)
/**Copyright(c)2016,烟台大学计算机与控制工程学院*All rights reserved*文件名称:123.cpp*作 者:王蕊*完成日期:2016年3月13日*版 本 号:v1. ...
- 第三周项目三-输出星号图(2)
/**Copyright(c)2016,烟台大学计算机与控制工程学院*All rights reserved*文件名称:123.cpp*作 者:王蕊*完成日期:2016年3月13日*版 本 号:v1. ...
- 第三周项目三-输出星号图(1)
/**Copyright(c)2016,烟台大学计算机与控制工程学院*All rights reserved*文件名称:123.cpp*作 者:王蕊*完成日期:2016年3月13日*版 本 号:v1. ...
最新文章
- 浅谈HTTP中Get与Post的区别
- plot参数详解python_30行Python代码实现3D数据可视化
- 晒晒一个多月的seo小成就
- Jquery中设置表格的悬浮和选中时行的背景颜色
- 【转】新浪微博手机客户端刷新都是手动刷新或者下拉刷新,为什么不设计成自动刷新?...
- C语言字符串数字提取函数,支持负数、浮点数、科学记数法
- Android 文件的上传
- 3.2存储器层次结构
- 启用RHEL5.6的VNC,使Windows可图形远程控制
- can卡、usbcan、can分析仪通用测试软件LCANTest详细介绍
- 【VISIO2016箭头使用】
- 食品和饮料销售预测分析
- 千挂科技与东风柳汽达成前装量产合作,2024年交付自动驾驶牵引车
- python 补获按键_qpython可以捕获耳机按键吗?
- 笔记 09-集合(HashSet HashMap TreeMap) 练习
- 新浪小编为您介绍留声机的古与今
- 孙溟㠭绘画篆刻——《梦》
- 安迪的第一个字典Uva 10815
- 编译原理实验 -- 文法分析
- Java程序员为何收入比其他行业收入高?原因是什么呢?
热门文章
- 文献笔记:Contrast-Phys: Unsupervised Video-based Remote Physiological Measurement viaSpatiotemporal Con
- 汇承金融科技:开创多渠道资产与资金撮合融资服务模式
- 通俗易懂【Springboot】 单文件下载和批量下载(多个文件合成一个压缩包下载)
- 产品分析 淘宝、京东、平多多
- qt linux不能读写u盘文件,Qt读取U盘文件内容
- .htaccess rewrite 规则详细说明
- 德州市德城区农产品区域公用品牌“尚德诚品”正式发布
- Java毕业设计_基于javaee创新创业实验室管理系统
- php:获取字符串的长度
- Mathematica绘制图形