#include <iostream>
#include <stdio.h>
#include <cstdlib>
#include <cstring>
#include <string>
#include <queue>
using namespace std; typedef struct MGraph{
string vexs[10];//顶点向量
int arcs[10][10];//邻接矩阵
int vexnum, arcnum;//图的顶点数和边数
}MGraph; int LocateVex(MGraph G, string u)//返回顶点u在图中位置
{
for(int i=0; i<G.vexnum; i++)
if(u==G.vexs[i])
return i;
return -1;
} void CreateUDG(MGraph &G)//构造无向图
{
string v1,v2;
int i, j, k;
cout<<"请输入顶点数和边数:";
cin>>G.vexnum>>G.arcnum; cout<<"请输入顶点:";
for(i=0; i<G.vexnum; i++)
cin>>G.vexs[i]; for(i=0; i<G.vexnum; i++)
for(j=0; j<G.vexnum; j++)
G.arcs[i][j]=0; cout<<"请输入边:"<<endl;
for(k=0; k<G.arcnum; k++)
{
cin>>v1>>v2;
i=LocateVex(G, v1);
j=LocateVex(G, v2);
G.arcs[i][j]=G.arcs[j][i]=1;
}
} void CreateUDN(MGraph &G)//构造无向网
{
string v1, v2;
int i, j, k;
int w;
cout<<"请输入顶点数和边数:";
cin>>G.vexnum>>G.arcnum; cout<<"请输入顶点:";
for(i=0; i<G.vexnum; i++)
cin>>G.vexs[i]; for(i=0; i<G.vexnum; i++)
for(j=0; j<G.vexnum; j++)
G.arcs[i][j]=-1000; cout<<"请输入边:"<<endl;
for(k=0; k<G.arcnum; k++)
{
cin>>v1>>v2>>w;
i=LocateVex(G, v1);
j=LocateVex(G, v2);
G.arcs[i][j]=G.arcs[j][i]=w;
}
} void CreateDG(MGraph &G)//构造有向图
{
string v1, v2;
int i, j, k;
cout<<"请输入顶点数和边数:";
cin>>G.vexnum>>G.arcnum; cout<<"请输入顶点:";
for(i=0; i<G.vexnum; i++)
cin>>G.vexs[i]; for(i=0; i<G.vexnum; i++)
for(j=0; j<G.vexnum; j++)
G.arcs[i][j]=0; cout<<"请输入边:"<<endl;
for(k=0; k<G.arcnum; k++)
{
cin>>v1>>v2;
i=LocateVex(G, v1);
j=LocateVex(G, v2);
G.arcs[i][j]=1;
}
} void CreateDN(MGraph &G)//构造有向网
{
string v1, v2;
int i, j, k;
int w;
cout<<"请输入顶点数和边数:";
cin>>G.vexnum>>G.arcnum; cout<<"请输入顶点:";
for(i=0; i<G.vexnum; i++)
cin>>G.vexs[i]; for(i=0; i<G.vexnum; i++)
for(j=0; j<G.vexnum; j++)
G.arcs[i][j]=-1000; cout<<"请输入边:"<<endl;
for(k=0; k<G.arcnum; k++)
{
cin>>v1>>v2>>w;
i=LocateVex(G, v1);
j=LocateVex(G, v2);
G.arcs[i][j]=w;
}
} int FirstAdjVex(MGraph G, int v)//返回顶点v的第一个邻接顶点序号
{
for(int i=0; i<G.vexnum; i++)
if(G.arcs[v][i]==1)
return i;
return -1;
} int NextAdjVex(MGraph G, int v, int w)//返回顶点v的相对于w的下一个邻接顶点序号
{
for(int i=w+1; i<G.vexnum; i++)
if(G.arcs[v][i]==1)
return i;
return -1;
} bool visited[100]; void DFS(MGraph G, int v)
{
visited[v]=true;
cout<<G.vexs[v]<<" ";
for(int w=FirstAdjVex(G, v); w>=0; w=NextAdjVex(G, v, w))
if(!visited[w])
DFS(G, w);
} void DFSTraverse(MGraph 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(MGraph G)//广搜,类似于树的层次遍历
{
for(int i=0; i<G.vexnum; i++)
visited[i]=false; queue<int> q; for(i=0; i<G.vexnum; i++)
{
if(!visited[i])
{
visited[i]=true;
q.push(i);
while(!q.empty())
{
int v=q.front();
q.pop();
cout<<G.vexs[v]<<" ";
for(int w=FirstAdjVex(G, v); w>=0; w=NextAdjVex(G, v, w))
{
if(!visited[w])
{
visited[w]=true;
q.push(w);
}
}
}
}
}
} void main()
{
MGraph g;
CreateUDG(g); cout<<"深搜:";
DFSTraverse(g);
cout<<endl; cout<<"广搜:";
BFSTraverse(g);
cout<<endl;
}

图的结构如下:

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

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

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

  2. 15 图-图的遍历-基于邻接矩阵实现的BFS与DFS算法

    算法分析和具体步骤解说直接写在代码注释上了 TvT 没时间了等下还要去洗衣服 就先不赘述了 有不明白的欢迎留言交流!(估计是没人看的了) 直接上代码: #include<stdio.h> ...

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

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

  4. 算法学习笔记(六) 二叉树和图遍历—深搜 DFS 与广搜 BFS

    图的深搜与广搜 复习下二叉树.图的深搜与广搜. 从图的遍历说起.图的遍历方法有两种:深度优先遍历(Depth First Search), 广度优先遍历(Breadth First Search),其 ...

  5. 【数据结构】图的基本操作——图的构造(邻接矩阵,邻接表),遍历(DFS,BFS)

    邻接矩阵实现如下: /* 主题:用邻接矩阵实现 DFS(递归) 与 BFS(非递归) 作者:Laugh 语言:C++ ***************************************** ...

  6. 图的基本操作(基于邻接表):图的构造,深搜(DFS),广搜(BFS)

    #include <iostream> #include <string> #include <queue> using namespace std; //表结点 ...

  7. 图的存储结构(邻接矩阵与邻接表)及其C++实现

    一.图的定义 图是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为: G=(V,E) 其中:G表示一个图,V是图G中顶点的集合,E是图G中顶点之间边的集合. 注: 在线性表中,元素个数可以为零, ...

  8. 图数据库|基于 Nebula Graph 的 BetweennessCentrality 算法

    本文首发于 Nebula Graph Community 公众号 ​在图论中,介数(Betweenness)反应节点在整个网络中的作用和影响力.而本文主要介绍如何基于 Nebula Graph 图数据 ...

  9. 图结构练习——判断给定图是否存在合法拓扑序列(dfs算法(第一个代码),邻接矩阵(前两个代码),邻接表(第三个代码))

    sdut 2140 图结构练习——判断给定图是否存在合法拓扑序列 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述  给定一个有向图 ...

随机推荐

  1. 获取静态 selected的当前的value的值

    <!DOCTYPE html><html><head><script>function checkField(val){alert("输入值已 ...

  2. oracle 存储过程 clob 字段 调试

    clob 没法直接赋值调试,可以新建一个存储过程,赋值给clob字段,然后调试

  3. python 中is和== 的理解

    Python中的对象包含三要素:id.type.value其中id用来唯一标识一个对象,type标识对象的类型,value是对象的值is判断的是a对象是否就是b对象,是通过id来判断的==判断的是a对 ...

  4. javascript 浮点数比较

    Js中两个浮点数比较,不能使用=== 必须用相减绝对值小于极小的一个数字来判断 Math.abs(1/3 - (1-2/3))<0.0001 这样的方式来判断.

  5. 求阶乘的和(for循环)

    第二种方法:

  6. window 命令大全

    运行操作 CMD命令:开始->运行->键入cmd或command(在命令行里可以看到系统版本.文件系统版本) CMD命令锦集       1. gpedit.msc-----组策略 2. ...

  7. jQuery Ajax实例各种使用方法详解

    在jquery中ajax实现方法分类很多种,如有:load.jQuery.get.jQuery.post.jQuery.getScript.jQuery Ajax 事件.jQuery.ajaxSetu ...

  8. pytest七:assert断言

    断言是写自动化测试基本最重要的一步,一个用例没有断言,就失去了自动化测试的意义了.什么是断言呢?简单来讲就是实际结果和期望结果去对比,符合预期那就测试 pass,不符合预期那就测试 failed py ...

  9. python 全栈开发,Day7(元组转换,列表以及字典的坑,集合,关系测试,深浅copy,编码补充)

    一.元组转换 数字 tu = (1) tu1 = (1,) print(tu,type(tu)) print(tu1,type(tu1)) 执行输出: 1 <class 'int'>(1, ...

  10. node.js开发博客系统---前端项目搭建(一)

    Express: https://github.com/petecoop/generator-express 安装node.js和npm 执行: npm install -g yo npm insta ...