`
pleasetojava
  • 浏览: 701220 次
  • 性别: Icon_minigender_2
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

无向图的一节点到另一节点的最短路径(边数最少的路径)(采用邻接表存储)

 
阅读更多

// 无向图的一节点到另一节点的最短路径(边数最少的路径)(采用邻接表存储).cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include<iostream>
#define MAX 100
#define MAXQ 50
using namespace std;

struct edgeNode
{
int no; //边端的序号
char info; //边端的名称
struct edgeNode * next; //下一个
};

struct vexNode
{
char info; //节点名称
struct edgeNode *link; //与之相连的端点
};

//存储节点信息
vexNode adjlist[MAX];
//循环队列
int queue[MAXQ];
//访问标志
bool visited[MAX];
//存储从指定点到每一个点的路径
int parent[MAX];

//建立邻接表存储,返回节点个数
int createGraph(vexNode *adjlist)
{
int n,e;
cout<<"请输入节点数:";
cin>>n;
cout<<"请输入边数:";
cin>>e;
int i;
for(i=1;i<=n;i++)
{
cout<<"请输入节点"<<i<<"的名称:";
cin>>adjlist[i].info;
adjlist[i].link = NULL;
}
edgeNode *p1,*p2;
int v1,v2;
for(i=1;i<=e;i++)
{
cout<<"请输入边"<<i<<"的二端的节点序号:";
cin>>v1>>v2;
p1 = (edgeNode*)malloc(sizeof(edgeNode));
p2 = (edgeNode*)malloc(sizeof(edgeNode));
p1->no = v1;
p1->info = adjlist[v1].info;
p1->next = adjlist[v2].link;
adjlist[v2].link = p1;
p2->no = v2;
p2->info = adjlist[v2].info;
p2->next = adjlist[v1].link;
adjlist[v1].link = p2;
}
return n;
}

//广度优先搜索无向无权图,返回起始点
int BFS(vexNode *adjlist,int *queue,bool *visited,int *parent)
{
int front,rear,v1;
cout<<"请输入从哪个序号的点开始搜索:";
cin>>v1;
front = 0;
rear = 1;
queue[rear] = v1;
int i;
//访问标志清空
for(i=1;i<MAX;i++)
visited[i] = false;
visited[v1] = true;
cout<<"广度优先搜索次序为:"<<endl;
cout<<"节点"<<v1<<",名称"<<adjlist[v1].info<<endl;
int vx;
edgeNode *p;
while(front != rear)
{
front = (front + 1)%MAXQ;
vx = queue[front];
p = adjlist[vx].link;
while(p!=NULL)
{
if(!visited[p->no])
{
visited[p->no] = true;
cout<<"节点"<<p->no<<",名称"<<adjlist[p->no].info<<endl;
rear = (rear + 1)%MAXQ;
queue[rear] = p->no;
parent[p->no] = vx;
}
p=p->next;
}
}
return v1;
}

//打印起始点到目标节点的最少边数目的路径(最短路径)
//v是目标节点
void print_line(vexNode *adjlist,int *parent,int v)
{
int j = v;
if(parent[j] != 0)
print_line(adjlist,parent,parent[j]);
cout<<adjlist[j].info<<" ";
}


int _tmain(int argc, _TCHAR* argv[])
{
int cases;
cout<<"请输入案例的个数:";
cin>>cases;
while(cases--)
{
//创建邻接表
int n = createGraph(adjlist);
//广度优先搜索
int v1 = BFS(adjlist,queue,visited,parent);
//起始节点没有前驱节点
parent[v1] =0;
int v;
cout<<"请输入目标节点:";
cin>>v;
//打印起始点到目标节点的最少边数目的路径(最短路径)
cout<<"从起始节点"<<adjlist[v1].info<<"到"<<adjlist[v].info<<"节点的最短路径为:"<<endl;
print_line(adjlist,parent,v);
cout<<endl;
}
system("pause");
return 0;
}

------------------------------------------------程序测试------------------------------------------------

请输入案例的个数:1
请输入节点数:8
请输入边数:10
请输入节点1的名称:r
请输入节点2的名称:s
请输入节点3的名称:t
请输入节点4的名称:u
请输入节点5的名称:v
请输入节点6的名称:w
请输入节点7的名称:x
请输入节点8的名称:y
请输入边1的二端的节点序号:1 2
请输入边2的二端的节点序号:1 3
请输入边3的二端的节点序号:2 4
请输入边4的二端的节点序号:3 5
请输入边5的二端的节点序号:3 6
请输入边6的二端的节点序号:5 6
请输入边7的二端的节点序号:5 8
请输入边8的二端的节点序号:6 7
请输入边9的二端的节点序号:6 8
请输入边10的二端的节点序号:7 8
请输入从哪个序号的点开始搜索:2
广度优先搜索次序为:
节点2,名称s
节点4,名称u
节点1,名称r
节点3,名称t
节点6,名称w
节点5,名称v
节点8,名称y
节点7,名称x
请输入目标节点:6
从起始节点s到w节点的最短路径为:
s r t w
请按任意键继续. . .

分享到:
评论

相关推荐

    插入删除节点和边——邻接表和矩阵存储结构

    利用邻接表和邻接矩阵存储结构,对有向或无向图进行插入、删除节点和边的操作! 利用邻接表和邻接矩阵存储结构,对有向或无向图进行插入、删除节点和边的操作!

    图的邻接表的实现带权路径

    建立有向图的邻接表更简单,每当读人一个顶点对序号 ,j&gt; 时,仅需生成一个邻接序号为j的边表结点,将其插入到vj的出边表头部即可。 同时没个节点带权访问。 邻接表的形式说明 typedef struct node{//边表结点  ...

    图的邻接表实现.rar

    C++实现图的邻接表,利用了类模板,可以构建有向图和无向图,包含链表、图的ADT,里面附有说明文档,详细说明了主程序的测试方式。

    数据结构关键路径程序

     对AOE网采用邻接表的存储方式。  读入AOE网采用邻接矩阵的方式进行输入:在对角线上的数值是0,如果从其中的一个节点到另外一个节点不可到达,那么对应于矩阵中的相应位置则输入为0进行表示。  输出各关键...

    无向图遍历

    无向图的存储方式有邻接矩阵,邻接链表,稀疏矩阵等。 无向图主要包括双方面内容,图的遍历和寻找联通分量。 无向图的遍历 无向图的遍历有两种方式—广度优先搜索(BFS)和深度优先搜索(DFS)。广度优先搜索在遍历一...

    数据结构课设图综合算法

    有向图的算法中包括:广度优先算法 、深度优先搜索、普利姆算法、克鲁斯卡尔算法以及有向图到无向图的转化;无向图的算法中包括:弗洛伊德算法、拓扑排序算法、迪杰斯特拉;在四类存储方式各自算法中,都包括了:...

    ACM 算法经典代码 数据结构经典代码

    1. 无向图关键边(dfs邻接阵形式) 41 2. 无向图关键点(dfs邻接阵形式) 42 3. 无向图块(bfs邻接阵形式) 43 4. 无向图连通分支(bfs邻接阵形式) 43 5. 无向图连通分支(dfs邻接阵形式) 44 6. 有向图强连通分支(bfs邻接阵...

    数据结构图遍历的演示

    1. 以邻接表为存储结构,演示在连通无向图上访问全部节点的操作。该无向图为一个交通网络,共25个节点,30条边,遍历时需要以用户指定的节点为起点,建立深度优先生成树和广度优先生成树,再按凹入表或树形打印生成...

    图的遍历演示

    1. 以邻接表为存储结构,实现连通无向图的深度优先和广度优先遍历。以用户指定的结点为起点,分别输出每种遍历下的结点访问序列和相应生成树的边集。 2. 每个结点用一个编号表示(如果一个图有n个结点,则它们的编号...

    数据结构一学期作业(顺序栈,三元组,串,树,邻接表,邻接矩阵,二叉树,等等代码c语言实现)

    2019/12/09 21:30 1,406 邻接矩阵.cpp 2019/10/27 14:38 1,183 链栈.cpp 2019/10/27 14:23 1,123 链队列.cpp 2019/10/18 21:44 1,070 顺序栈.cpp 2019/09/24 14:57 1,663 顺序表.cpp 2019/10/15 15:47 1,087 ...

    数据结构实验报告-图的遍历.doc

    2、输入顶点数、边数、每个顶点的值以及每一条边的信息,构造一个无向图G,并用邻 接表存储该图 3、深度优先遍历第一步中构造的图G,输出得到的节点序列 4、广度优先遍历第一部中构造的图G,输出得到的节点序列 三...

    2022数据结构课设easyx实现顺序表,链式栈和无向图的算法的动态演示代码

    3)无向图或有向图(存储结构可选:相邻 矩阵或邻接表)。 2、在指定数据结构类型基础上,加载数据结构初始化数据,以指定元素 (节点)集、关系集的形式初始化指定的数据结构,并在界面中绘制出相应的 图形以及数据存储的...

    数据结构与常见算法,从递归开始,排序,至链表,队列,栈,树,图等。.zip

    逻辑结构:描述数据元素之间的逻辑关系,如线性结构(如数组、链表)、树形结构(如二叉树、堆、B树)、图结构(有向图、无向图等)以及集合和队列等抽象数据类型。 存储结构(物理结构):描述数据在计算机中如何...

    此仓库存储的是数据结构与经典算法.zip

    例如,数组的连续存储,链表的动态分配节点,树和图的邻接矩阵或邻接表表示等。 基本操作:针对每种数据结构,定义了一系列基本的操作,包括但不限于插入、删除、查找、更新、遍历等,并分析这些操作的时间复杂度和...

    数据结构课程设计

    (1)写出将一个无向图的邻接矩阵转换成邻接表的算法 (2)设计一个算法,判断无向图G是否连通。若连通则返回1; 返回0。 7、内部排序算法的性能分析 要求:(1)对冒泡排序、直接排序、简单选择排序、快速排序...

    数据结构&amp;算法,丑数,UglyNumber.zip

    例如,数组的连续存储,链表的动态分配节点,树和图的邻接矩阵或邻接表表示等。 基本操作:针对每种数据结构,定义了一系列基本的操作,包括但不限于插入、删除、查找、更新、遍历等,并分析这些操作的时间复杂度和...

    数据结构与算法复习(Java):排序、字符串、数组、链表、二分查找、二叉树.zip

    逻辑结构:描述数据元素之间的逻辑关系,如线性结构(如数组、链表)、树形结构(如二叉树、堆、B树)、图结构(有向图、无向图等)以及集合和队列等抽象数据类型。 存储结构(物理结构):描述数据在计算机中如何...

    数据结构(英语:data structure)是计算机中存储、组织数据的方式。正确的数据结构选择可以提高算法的效率.zip

    例如,数组的连续存储,链表的动态分配节点,树和图的邻接矩阵或邻接表表示等。 基本操作:针对每种数据结构,定义了一系列基本的操作,包括但不限于插入、删除、查找、更新、遍历等,并分析这些操作的时间复杂度和...

Global site tag (gtag.js) - Google Analytics