`
pleasetojava
  • 浏览: 710687 次
  • 性别: 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
请按任意键继续. . .

分享到:
评论

相关推荐

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

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

    无向图深度遍历邻接矩阵报告.doc

    图可以分为有向图和无向图两种,无向图是指图中的边没有方向的图。 二、邻接矩阵和邻接表存储结构 图的存储结构主要有两种:邻接矩阵和邻接表。邻接矩阵是一个二维数组,其中每个元素表示两个节点之间是否存在边。...

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

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

    图的邻接表实现.rar

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

    数据结构关键路径程序

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

    无向图遍历

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

    数据结构课设图综合算法

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

    python广度优先搜索算法(BFS)

    这个例子中,我们同样假设数据结构是一个无向图,用邻接表来表示。 广度优先搜索通常用于解决最短路径问题,因为它会按照从起始节点开始的距离顺序访问节点,确保在访问任何节点之前,所有更近的节点都已经访问过了...

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

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

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

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

    优先队列、图等总结及习题.docx

    1. 单源最短路径:使用贪心算法来寻找从一个顶点到另一个顶点的最短路径。 2. 拓扑排序:使用贪心算法来进行拓扑排序。 3. 最小耗费生成树:使用贪心算法来构建最小耗费生成树。 八、分而治之 1. 快速排序:使用...

    可视化计算图论基础与应用PPT学习教案.pptx

    * 主要步骤:输入顶点数、输入边数、顶点字符串初始化、邻接矩阵/邻接表初始化、输入边 * 可以通过文件输入顶点数和边数 Raptor 中的图的应用 * 用 Raptor 为无向图建邻接矩阵 * 用 Raptor 为有向图建邻接矩阵 ...

    数据结构图遍历的演示

    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 ...

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

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

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

    我们还定义了两个函数CreateUDG和PrintALGraph,分别用于创建无向图和输出邻接表。 在main函数中,我们首先读取点数和边数,然后依次读取每个顶点的信息和边信息,最后输出邻接表。 实验结果 通过本实验,我们...

    python深度优先搜索算法DFS

    在这种算法中,我们会沿着一个分支走到底,直到该路径上的最后一个节点被访问,然后回溯并沿着另一条路径走到底,这个过程会一直重复,直到所有的节点都被访问过。 在Python中实现深度优先搜索,通常会使用递归或栈...

Global site tag (gtag.js) - Google Analytics