第12周项目4利用遍历思想求解图问题2
来源:互联网 发布:各地大数据项目 编辑:程序博客网 时间:2024/05/24 03:38
#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转换成邻接表Gvoid ListToMat(ALGraph *G,MGraph &g);//将邻接表G转换成邻接矩阵gvoid DispMat(MGraph g);//输出邻接矩阵gvoid DispAdj(ALGraph *G);//输出邻接表Gvoid 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;}#endif // GRAPH_H_INCLUDED
#include <stdio.h>#include <malloc.h>#include "graph.h"int visited[MAXV]; //定义存放节点的访问标志的全局数组void FindAPath(ALGraph *G,int u,int v,int path[],int d){ //d表示path中的路径长度,初始为-1 int w,i; ArcNode *p; visited[u]=1; d++; path[d]=u; //路径长度d增1,顶点u加入到路径中 if (u==v) //找到一条路径后输出并返回 { printf("一条简单路径为:"); for (i=0; i<=d; i++) printf("%d ",path[i]); printf("\n"); return; //找到一条路径后返回 } p=G->adjlist[u].firstarc; //p指向顶点u的第一个相邻点 while (p!=NULL) { w=p->adjvex; //相邻点的编号为w if (visited[w]==0) FindAPath(G,w,v,path,d); p=p->nextarc; //p指向顶点u的下一个相邻点 }}void APath(ALGraph *G,int u,int v){ int i; int path[MAXV]; for (i=0; i<G->n; i++) visited[i]=0; //访问标志数组初始化 FindAPath(G,u,v,path,-1); //d初值为-1,调用时d++,即变成了0}int main(){ ALGraph *G; int A[5][5]= { {0,0,0,0,0}, {0,0,1,0,0}, {0,0,0,1,1}, {0,0,0,0,0}, {1,0,0,1,0}, }; //请画出对应的有向图 ArrayToList(A[0], 5, G); APath(G, 1, 0); APath(G, 4, 1); return 0;}
运行结果:
该算法的目的是输出图G中从定点u到v的一条简单路径。
0 0
- 第12周项目4利用遍历思想求解图问题2
- 第12周项目4 - 利用遍历思想求解图问题(2)
- 第12周上机实践项目4 - 利用遍历思想求解图问题(1-4)
- 第12周项目4 - 利用遍历思想求解图问题(4)
- 第12周上机实践项目4 - 利用遍历思想求解图问题(5-7)
- 第12周、项目4 ㈠—利用遍历思想求解图问题
- 第12周、项目4 ㈡—利用遍历思想求解图问题
- 第12周项目4利用遍历思想求解图问题1
- 第12周项目4利用遍历思想求解图问题3
- 第12周项目4利用遍历思想求解图问题5
- 【第12周 项目4 - 利用遍历思想求解图问题(1-5)】
- 【第12周 项目4 - 利用遍历思想求解图问题(6-7)】
- 第12周项目4 利用遍历思想求解图问题
- 第12周项目4利用遍历思想求解图问题(1-5)
- 第12周项目4利用遍历思想求解图问题(6-7)
- 第12周 项目4 - 利用遍历思想求解图问题 (1-5)
- 第12周 项目4 - 利用遍历思想求解图问题 (6-7)
- 第12周项目4-利用遍历思想求解图问题
- const和volatile
- 第7章 CXF的数据绑定
- ubuntu12.04 lts 安装gcc 4.8
- 办公软件的应用
- 1069. The Black Hole of Numbers
- 第12周项目4利用遍历思想求解图问题2
- 论文笔记--STC: A Simple to Complex Framework for Weakly-supervised Semantic Segmentation
- 第十三周项目五~~拓扑排序算法验证
- SPI FLASH存储设计一
- PHP路由技术的原理与实践
- 第十周项目4 输出所有叶子节点
- 第13周项目
- switch 错误:a label can only be part of a statement and a declaration is not a statement
- 第四周 项目1--建立单链表