_DataStructure_C_Impl:求图G中从顶点u到顶点v的一条简单路径
#pragma once
#include<stdio.h>
#include<stdlib.h>
#define StackSize 100
typedef int DataType; //栈元素类型定义
typedef struct{DataType stack[StackSize];int top;
}SeqStack;
//将栈初始化为空栈只需要把栈顶指针top置为
void InitStack(SeqStack *S){S->top=0;//把栈顶指针置为0
}
//判断栈是否为空,栈为空返回1,否则返回0
int StackEmpty(SeqStack S){if(S.top==0)return 1;elsereturn 0;
}
//取栈顶元素。将栈顶元素值返回给e,并返回1表示成功;否则返回0表示失败。
int GetTop(SeqStack S,DataType *e){if(S.top<=0){ //在取栈顶元素之前,判断栈是否为空printf("栈已经空!\n");return 0;}else{*e=S.stack[S.top-1]; //在取栈顶元素return 1;}
}
//将元素e进栈,元素进栈成功返回1,否则返回0
int PushStack(SeqStack *S,DataType e){if(S->top>=StackSize){ //在元素进栈前,判断是否栈已经满printf("栈已满,不能进栈!\n");return 0;}else{S->stack[S->top]=e; //元素e进栈S->top++; //修改栈顶指针return 1;}
}
//出栈操作。将栈顶元素出栈,并将其赋值给e。出栈成功返回1,否则返回0
int PopStack(SeqStack *S,DataType *e){if(S->top<=0){ //元素出栈之前,判断栈是否为空printf("栈已经没有元素,不能出栈!\n");return 0;}else{S->top--; //先修改栈顶指针,即出栈*e=S->stack[S->top]; //将出栈元素赋值给ereturn 1;}
}
//求栈的长度,即栈中元素个数,栈顶指针的值就等于栈中元素的个数
int StackLength(SeqStack S){return S.top;
}
//清空栈的操作
void ClearStack(SeqStack *S){S->top=0;
}
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"SeqStack.h"
typedef char VertexType[4];
typedef char InfoPtr;
typedef int VRType;
#define MaxSize 50 //最大顶点个数
typedef enum{DG,DN,UG,UN}GraphKind; //图的类型:有向图、有向网、无向图和无向网
//边结点的类型定义
typedef struct ArcNode{int adjvex; //弧指向的顶点的位置InfoPtr *info; //弧的权值struct ArcNode *nextarc; //指示下一个与该顶点相邻接的顶点
}ArcNode;
//头结点的类型定义
typedef struct VNode{VertexType data; //用于存储顶点ArcNode *firstarc; //指示第一个与该顶点邻接的顶点
}VNode,AdjList[MaxSize];
//图的类型定义
typedef struct{AdjList vertex; //头结点int vexnum,arcnum; //图的顶点数目与弧的数目GraphKind kind; //图的类型
}AdjGraph;
//求图G中从顶点u到顶点v的一条简单路径
void BriefPath(AdjGraph G,int u,int v){int k,i;SeqStack S;ArcNode *p;int visited[MaxSize];int parent[MaxSize]; //存储已经访问顶点的前驱顶点InitStack(&S);for(k=0;k<G.vexnum;k++)visited[k]=0; //访问标志初始化PushStack(&S,u); //开始顶点入栈visited[u]=1; //访问标志置为1while(!StackEmpty(S)){ //广度优先遍历图,访问路径用parent存储PopStack(&S,&k);p=G.vertex[k].firstarc;while(p!=NULL){if(p->adjvex==v){ //如果找到顶点vparent[p->adjvex]=k; //顶点v的前驱顶点序号是kprintf("顶点%s到顶点%s的路径是:",G.vertex[u].data,G.vertex[v].data);i=v;do{ //从顶点v开始将路径中的顶点依次入栈PushStack(&S,i);i=parent[i];}while(i!=u);PushStack(&S,u);while(!StackEmpty(S)){ //从顶点u开始输出u到v中路径的顶点PopStack(&S,&i);printf("%s ",G.vertex[i].data);}printf("\n");}else if(visited[p->adjvex]==0){ //如果未找到顶点v且邻接点未访问过,则继续寻找visited[p->adjvex]=1;parent[p->adjvex]=k;PushStack(&S,p->adjvex);}p=p->nextarc;}}
}
//返回图中顶点对应的位置
int LocateVertex(AdjGraph G,VertexType v){int i;for(i=0;i<G.vexnum;i++)if(strcmp(G.vertex[i].data,v)==0)return i;return -1;
}
//采用邻接表存储结构,创建无向图N
void CreateGraph(AdjGraph *G){int i,j,k,w;VertexType v1,v2; /*定义两个顶点v1和v2*/ArcNode *p;printf("请输入图的顶点数,边数(以逗号分隔): ");scanf("%d,%d",&(*G).vexnum,&(*G).arcnum);printf("请输入%d个顶点的值:",G->vexnum);for(i=0;i<G->vexnum;i++) /*将顶点存储在头结点中*/{scanf("%s",G->vertex[i].data);G->vertex[i].firstarc=NULL; /*将相关联的顶点置为空*/}printf("请输入边的两个顶点(以空格作为分隔):\n");for(k=0;k<G->arcnum;k++) /*建立边链表*/{scanf("%s%s",v1,v2);i=LocateVertex(*G,v1);j=LocateVertex(*G,v2);/*j为入边i为出边创建邻接表*/p=(ArcNode*)malloc(sizeof(ArcNode));p->adjvex=j;p->info=(InfoPtr*)malloc(sizeof(InfoPtr));/*将p指向的结点插入到边表中*/p->nextarc=G->vertex[i].firstarc;G->vertex[i].firstarc=p;/*i为入边j为出边创建邻接表*/p=(ArcNode*)malloc(sizeof(ArcNode));p->adjvex=i;p->info=NULL;p->nextarc=G->vertex[j].firstarc;G->vertex[j].firstarc=p;}(*G).kind=UG;
}
//销毁无向图G
void DestroyGraph(AdjGraph *G){int i;ArcNode *p,*q;for(i=0;i<G->vexnum;++i) /*释放图中的边表结点*/{p=G->vertex[i].firstarc; /*p指向边表的第一个结点*/if(p!=NULL) /*如果边表不为空,则释放边表的结点*/{q=p->nextarc;free(p);p=q;}}(*G).vexnum=0; /*将顶点数置为0*/(*G).arcnum=0; /*将边的数目置为0*/
}
//图G的邻接表的输出
void DisplayGraph(AdjGraph G){int i;ArcNode *p;printf("该图中有%d个顶点:",G.vexnum);for(i=0;i<G.vexnum;i++)printf("%s ",G.vertex[i].data);printf("\n图中共有%d条边:\n",2*G.arcnum);for(i=0;i<G.vexnum;i++){p=G.vertex[i].firstarc;while(p){printf("(%s,%s) ",G.vertex[i].data,G.vertex[p->adjvex].data);p=p->nextarc;}printf("\n");}
}
void main(){AdjGraph G;CreateGraph(&G); /*采用邻接表存储结构创建图G*/DisplayGraph(G); /*输出无向图G*/BriefPath(G,0,4); /*求图G中从顶点a到顶点e的简单路径*/DestroyGraph(&G); /*销毁图G*/system("pause");
}
_DataStructure_C_Impl:求图G中从顶点u到顶点v的一条简单路径相关推荐
- 4.6设计一个算法判断图G中从顶点u到v是否存在简单路径
1. 题目描述 假设图G采用邻接表存储,设计一个算法判断图G中从顶点u到v是否存在简单路径 所谓简单路径是指路径上的顶点不重复.可采用深度优先遍历的方法 #include <bits/stdc+ ...
- 【算法】图(一)拓扑排序的实现 图的邻接表算法 判断是否图G中存在环
文章目录 用list来表示图,判断是否存在环 邻接表实现拓扑排序 用DFS(邻接矩阵) 来实现拓扑排序. 判断无向图顶点是否全部连通 判断图G中从顶点u到v是否存在简单路径 输出图G中从顶点u到v的所 ...
- poj2186 求有向图G中所有点都能到达的点的数量
/*题意:有向图,求这样的点的数量:所有点都能到达它.缩点成有向无环图,思:如果该强连通有出度,那么 从该出度出去的边必然回不来(已经缩点了),所以有出度的强连通必然不是.那么是不是所有出度为0的强连 ...
- 图10——判断顶点u和顶点v是否存在简单路径
已有邻接表表示的有向图,编程判断从顶点u到顶点v是否存在简单路径若有,则打印出该路径上的顶点.要求先描述图中的存储结构,并简述算法思路:查找邻接顶点等图运算要自己实现(尽量采用非递归算法) [分析] ...
- 第十二周项目四----利用遍历思想求解图问题之输出简单路径
/*烟台大学计算机与控制工程学院 时间2015年12月14日 作者:孙潇 问题描述:假设图G采用邻接表存储,分别设计实现以下要求的算法,要求用区别于示例中的图进行多次测试,通过观察输出值,掌握相关问题 ...
- 如果图G=V,E是哈密尔顿图,则它必然具备下述性质
哥尼斯堡七桥问题是在寻找一条遍历图中所有边的简单路径,而哈密尔顿的周游世界问题则是在寻找一条遍历图中所有点的基本路径.在无向图G=<V,E>中,遍历G中每个顶点一次且仅一次的路径称为哈密尔 ...
- python画超长图-python—networkx:求图的平均路径长度并画出直方图
要绘制一个动态网络,到处找资料,收集相关的networkx绘图资料,计算路径的代码如下: NetworkX Examples-BASIC--properties #!/usr/bin/env pyth ...
- 基于广度优先遍历算法求采用邻接表存储的无向连通图G中从顶点u到v的最短路径
问题 假设图G采用邻接表存储,设计一个算法,求不带权无向连通图G中从顶点u->v的最短路径(路径上经过的顶点数最少.采用广度优先遍历来实现. 基本思路 我们首先来看一下BFS的过程: 图片摘自慕 ...
- 判断有向图g中顶点i到顶点j是否有路径_号称图的最短路径算法--Floyd算法
暑假,小哼准备去一些城市旅游.有些城市之间有公路,有些城市之间则没有,如下图.为了节省经费以及方便计划旅程,小哼希望在出发之前知道任意两个城市之前的最短路程. 上图中有4个城市8条公路,公路上的数字表 ...
最新文章
- 深拷贝——将对象拷贝到底
- python简易图形-python图形用户界面(四):教你实现一个简单实用的计时器
- 细颗粒度Singleton模式实现
- xampp打开mysql的admin访问被拒绝_我被我的电脑磁盘拒绝了,为什么打不开,而显示“拒绝访问”呢...
- 深入浅出extjs第2版_LINGO实例教程第2版第2期上线
- php生成图片水印,PHP生成图片加文字及图案水印办法
- ROS笔记(4) RoboWare Studio 的安装
- JDBC中Statement接口提供的execute、executeQuery和executeUpdate之间的区别
- mupdf嵌入 html页面,MuPDF Command Line Tools
- Ms Excel 2010合并单元格方法
- ant java任务_Ant War任务
- 计算机tpu定义,TPU聚氨酯
- Pidgin 插件法解决Ubuntu11.10 QQ
- STM32开发 -- Jlink常用命令
- Android 10.0 TV板 强制app横屏显示
- 130 个相见恨晚的超实用网站
- 暑假集训后的一些感想
- 【测试】18.系统测试及类型
- 1、python冒泡排序和快排
- 哥玩的不是劲舞,是寂寞【古龙版】