#include <iostream>
#include <string>
#include <queue>
using namespace std; //表结点
typedef struct ArcNode{
int adjvex;//该弧所指向的顶点的位置
ArcNode *nextarc;//指向下一条弧的指针
}ArcNode; //头结点
typedef struct VNode{
string data;//顶点信息
ArcNode* firstarc;//第一个表结点的地址,指向第一条依附该顶点的弧的指针
}VNode, AdjList[10]; typedef struct{
AdjList vertices;
int vexnum, arcnum;//图的顶点数和弧数
}ALGraph; int LocateVex(ALGraph G, string u)//返回顶点u在图中的位置
{
for(int i=0; i<G.vexnum; i++)
if(G.vertices[i].data==u)
return i;
return -1;
} void CreateUDG(ALGraph &G)//构造无向图
{
string v1, v2;
int i, j, k;
cout<<"请输入顶点数和边数:";
cin>>G.vexnum>>G.arcnum; cout<<"请输入顶点:";
for(i=0; i<G.vexnum; i++)
{
cin>>G.vertices[i].data;
G.vertices[i].firstarc=NULL;
} cout<<"请输入边:";
cout<<endl;
for(k=0; k<G.arcnum; k++)
{
cin>>v1>>v2;
i=LocateVex(G, v1);
j=LocateVex(G, v2); //插入v1的邻接表,为了提高效率,总在表头插入结点。
ArcNode *arc=new ArcNode;
arc->adjvex=j;
arc->nextarc=G.vertices[i].firstarc;
G.vertices[i].firstarc=arc; //插入v2的邻接表,为了提高效率,总在表头插入结点。
arc=new ArcNode;
arc->adjvex=i;
arc->nextarc=G.vertices[j].firstarc;
G.vertices[j].firstarc=arc; }
} void Print(ALGraph G)//打印邻接表
{
cout<<"打印邻接表如下:";
cout<<endl;
for(int i=0; i<G.vexnum; i++)//遍历每个顶点的邻接表
{
cout<<G.vertices[i].data;
ArcNode *p=G.vertices[i].firstarc; while(p)
{
cout<<"->"<<G.vertices[p->adjvex].data;
p=p->nextarc;
}
cout<<endl; } } int FirstAdjVex(ALGraph G, int v)//返回顶点v的第一个邻接点序号
{ ArcNode *p=G.vertices[v].firstarc;
if(p)
return p->adjvex;
else
return -1;
} int NextAdjVex(ALGraph G, int v, int w)//返回顶点v的相对于w的下一个邻接点序号
{ ArcNode* p=G.vertices[v].firstarc;
while(p)
{
if(p->adjvex==w)
break;
p=p->nextarc;
} if(p->adjvex!=w || !p->nextarc)//如果没找到w或者w是最后一个邻接点
return -1;
return p->nextarc->adjvex; }
bool visited[10]; void DFS(ALGraph G, int v)
{
visited[v]=true;
cout<<G.vertices[v].data<<" ";
for(int w=FirstAdjVex(G, v); w>=0; w=NextAdjVex(G, v, w) )
if(!visited[w])
DFS(G, w); } void DFSTraverse(ALGraph G)//深搜
{
for(int i=0; i<G.vexnum; i++)
visited[i]=false; for(i=0; i<G.vexnum; i++)
if(!visited[i])
DFS(G, i); } void BFSTraverse(ALGraph G)//广搜
{
queue<int> q;
for(int i=0; i<G.vexnum; i++)
visited[i]=false; for(i=0; i<G.vexnum; i++)
{
if(!visited[i])
{
q.push(i);
visited[i]=true;
while(!q.empty())
{
int v=q.front();
q.pop();
cout<<G.vertices[v].data<<" ";
for(int w=FirstAdjVex(G, v); w>=0; w=NextAdjVex(G, v, w))
{
if (!visited[w])
{
q.push(w);
visited[w]=true;
}
} }
} } } void main()
{
ALGraph G;
CreateUDG(G);
Print(G); cout<<"深搜:";
DFSTraverse(G);
cout<<endl; cout<<"广搜:";
BFSTraverse(G);
cout<<endl;
}

图的基本操作(基于邻接表):图的构造,深搜(DFS),广搜(BFS)的更多相关文章

  1. SDUT 2142 数据结构实验之图论二:基于邻接表的广度优先搜索遍历

    数据结构实验之图论二:基于邻接表的广度优先搜索遍历 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Descript ...

  2. 数据结构 《2》----基于邻接表表示的图的实现 DFS(递归和非递归), BFS

    图通常有两种表示方法: 邻接矩阵 和 邻接表 对于稀疏的图,邻接表表示能够极大地节省空间. 以下是图的数据结构的主要部分: struct Vertex{ ElementType element; // ...

  3. DS树+图综合练习--构建邻接表

    题目描述 已知一有向图,构建该图对应的邻接表.邻接表包含数组和单链表两种数据结构,其中每个数组元素也是单链表的头结点,数组元素包含两个属性,属性一是顶点编号info,属性二是指针域next指向与它相连 ...

  4. 三种邻接表存图模板:vector邻接表、数组邻接表、链式前向星

    vector邻接表: ; struct Edge{ int u,v,w; Edge(int _u=0,int _v=0,int _w=0){u=_u,v=_v,w=_w;} }; vector< ...

  5. 基于邻接表的长度为k的简单路径的求解

    描述 一个连通图采用邻接表作为存储结构.设计一个算法,判断无向图中任意给定的两点是否存在一条长度为k的简单路径. 输入 多组数据,每组m+3数据行.第一行有两个数字n,m和k,代表有n个顶点,m条边和 ...

  6. SDUT2142数据结构实验之图论二:基于邻接表的广度优先搜索遍历

    http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=2142&cid=1186 题目描述 给定一个无向连通图,顶点编号从0到n-1,用广度优先搜 ...

  7. 算法与数据结构(四) 图的物理存储结构与深搜、广搜(Swift版)

    开门见山,本篇博客就介绍图相关的东西.图其实就是树结构的升级版.上篇博客我们聊了树的一种,在后边的博客中我们还会介绍其他类型的树,比如红黑树,B树等等,以及这些树结构的应用.本篇博客我们就讲图的存储结 ...

  8. 基于邻接表的广度优先搜索遍历(bfs)

    题目:http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=2142&cid=1186 #include<stdio.h> #incl ...

  9. DFS,BFS 练习(深搜,广搜,图,leetcode)

    https://leetcode-cn.com/problems/route-between-nodes-lcci/ 节点间通路.给定有向图,设计一个算法,找出两个节点之间是否存在一条路径. 示例1: ...

随机推荐

  1. disabled属性对form表单向后台传值的影响

    在form表单里,如果对input加入disabled="disabled"或disabled="true"等属性,form表单提交的时候,就不会传值到后台. ...

  2. bzoj千题计划236:bzoj2300: [HAOI2011]防线修建

    http://www.lydsy.com/JudgeOnline/problem.php?id=2300 维护动态凸包,人懒用的set 用叉积判断,不要用斜率 #include<set> ...

  3. 转 -----那些年总也记不牢的IO

    关于资源关闭: 一般情况下是:先打开的后关闭,后打开的先关闭 另一种情况:看依赖关系,如果流a依赖流b,应该先关闭流a,再关闭流b 例如处理流a依赖节点流b,应该先关闭处理流a,再关闭节点流b 当然完 ...

  4. 工欲善其事必先利其器,用Emmet提高HTML编写速度

    HTML代码写起来很费事,因为它的标签多. 一种解决方法是采用模板,在别人写好的骨架内,填入自己的内容.还有一种很炫的方法----简写法. 常用的简写法,目前主要是Emmet和Haml两种.这两种简写 ...

  5. 20155232 2016-2017-3 《Java程序设计》第8周学习总结

    20155232 2016-2017-3 <Java程序设计>第8周学习总结 教材学习内容总结 第十四章NIO与NIO2 NIO使用频道来衔接数据结点,在处理数据时,NIO可以让你设定缓冲 ...

  6. 20155210潘滢昊 2016-2017-2 《Java程序设计》第8周学习总结

    20155210 2016-2017-2 <Java程序设计>第8周学习总结 教材学习内容总结 认识NIO Channel: 衔接数据节点(与IO中的流对比) isOpen close R ...

  7. 第8月第12天 python json.dumps danmu

    1.json.dumps return JsonResponse({ 'status': WechatMessage.POST_METHOD_REQUIRED[1], 'status_code': W ...

  8. asp.net(c#)中相对路径(虚拟路径)和物理磁盘路径的转换

    物理路径:磁盘路径,也就是在磁盘上的位置. 虚拟路径:web页面上的路径,是相对于应用程序而言的. /// 将物理路径转换成相对路径           /// </summary>   ...

  9. Android EditText被软键盘遮盖处理

    这两天android app新增了透明栏效果,结果发现键盘弹起后会遮盖屏幕底部的EditText,没有像想象中的调整窗口大小,并滚动ScrollView,将EditText显示在键盘上方.之前也遇到过 ...

  10. EM算法理解

    一.概述 概率模型有时既含有观测变量,又含有隐变量,如果概率模型的变量都是观测变量,那么给定数据,可以直接利用极大似然估计法或者贝叶斯估计法估计模型参数.但是,当模型同时又含有隐变量时,就不能简单地使 ...