#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. Pcap4J实现抓包器

    前段时间搞抓包程序,打算使用Pcap4J实现,发现除了GitHub,其它资料少之又少,几乎都是不起作用. 被迫我一直看(日本作者!)英文注解的源码和sample和test,比较费劲+营养很少.因为几乎 ...

  2. springboot系列六、springboot配置错误页面及全局异常

    一.spring1.x中处理方式 @Bean public EmbeddedServletContainerCustomizer containerCustomizer() { return new ...

  3. P3567 [POI2014]KUR-Couriers

    题目描述 Byteasar works for the BAJ company, which sells computer games. The BAJ company cooperates with ...

  4. cacti系列(二)之cacti添加对tomcat服务器的监控

    cacti添加对tomcat的监控 1.首先下载监控tomcat的模板 TomcatStats-0.1.zip    2.导入模板 (cacti_host_template_tomcat_server ...

  5. FreeSWITCH IVR中lua调用并执行nodejs代码

    一.功能需求: 通过FreeSWITCH的IVR按键调用相应的脚本文件:nodejs提供很多的模组,可以方便的与其它系统或者进行任何形式的通讯,我的应用是通过nodejs发送http post请求: ...

  6. Android用户界面开发:Fragment

    Android用户界面开发:Fragment 1:注意事项  3.0以前的Android 版本要使用FragmentActivity 来装载Fragment ,使用到support v4包.  3.0 ...

  7. 常见的js算法

    参考地址:链接

  8. 错误/异常:java.io.FileNotFoundException: .\src\db.properties (系统找不到指定的路径。);的解决方法

    1.异常视图 2.解决方法 与之相关的部分代码: static{ try { //读取db.properties Properties props = new Properties(); FileIn ...

  9. Oracle12c 性能优化攻略:攻略1-1:创建具有最优性能的数据库

    一:章节前言 本章着眼于影响表中数据存储性能的数据库特性. 表的性能部分取决于在创建之前所应用的数据库特性.例如:在最初创建数据库时采用的物理存储特性以及相关的表空间都会在后来影响表的性能.类似地,表 ...

  10. python与redis

    1.什么是redis Redis 是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset ...