#include <iostream>
using namespace std;
#define INFINITY INT_MAX
#define MAX_VERTEX_NUM 20//最大顶点个数
typedef enum{DG,DN,UDG,UDN}GraphKind;
typedef struct{string vexs[MAX_VERTEX_NUM];//顶点向量 int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//邻接矩阵.对无权图,用1或0表示相邻否;对带权图,则为权值类型int vexnum,arcnum;//图的当前顶点数和弧数 GraphKind kind;//图的种类标志
}MGraph;
int LocateVex(MGraph G,string v)
{int i;for(i=0;i<G.vexnum;i++){if(G.vexs[i]==v)break;}return i;
}
void Create(MGraph &G)
{int i;cout<<"图的顶点数:";cin>>G.vexnum;cout<<"图的弧数:";cin>>G.arcnum;cout<<"图的当前顶点名:";for(i=0;i<G.vexnum;i++)cin>>G.vexs[i];//构造顶点向量
}
void CreateDG(MGraph &G)
{int i,j,k;string v1,v2; Create(G);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 CreateUDG(MGraph &G)
{int i,j,k;string v1,v2; Create(G);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;G.arcs[j][i]=1;}
}
void CreateDN(MGraph &G)
{int i,j,k;string v1,v2; Create(G); for(i=0;i<G.vexnum;i++)for(j=0;j<G.vexnum;j++)G.arcs[i][j]=INFINITY;//初始化邻接矩阵 cout<<"依次输入图的弧头顶点和弧尾顶点及弧的权值:"<<endl;for(k=0;k<G.arcnum;k++){cin>>v1>>v2;i=LocateVex(G,v1);j=LocateVex(G,v2);cin>>G.arcs[i][j];}
}
void CreateUDN(MGraph &G)
{int i,j,k;string v1,v2; Create(G);for(i=0;i<G.vexnum;i++)for(j=0;j<G.vexnum;j++)G.arcs[i][j]=INFINITY;//初始化邻接矩阵 cout<<"依次输入图的弧连接的两顶点及弧的权值:"<<endl;for(k=0;k<G.arcnum;k++){cin>>v1>>v2;i=LocateVex(G,v1);j=LocateVex(G,v2);cin>>G.arcs[i][j];G.arcs[j][i]=G.arcs[i][j]; }
}
void PrintAdjMatrix(MGraph G)
{int i,j;for(i=0;i<G.vexnum;i++){for(j=0;j<G.vexnum;j++){if(G.arcs[i][j]==INFINITY)cout<<"∞"<<'\t';else cout<<G.arcs[i][j]<<'\t';}cout<<endl;}
}
int visit1[MAX_VERTEX_NUM];
void DFS(MGraph G,int v)
{int w; cout<<G.vexs[v]<<'\t';visit1[v]=1;//访问第v个顶点 for(w=1;w<G.vexnum;w++)//依次检查邻接矩阵v所在行 {if(visit1[w]!=1&&G.arcs[v][w]!=INFINITY&&G.arcs[v][w]!=0)DFS(G,w);}
}
void BFS(MGraph G,int v)
{int i(0),j(1),w,visit2[G.vexnum];string  a[G.vexnum];cout<<G.vexs[v]<<'\t';visit2[v]=1;//访问第v个顶点a[i]=G.vexs[v];//深度优先数组 while(i<G.vexnum) {     for(w=1;w<G.vexnum;w++)//依次检查邻接矩阵v所在行 {if(visit2[w]!=1&&G.arcs[v][w]!=INFINITY&&G.arcs[v][w]!=0){cout<<G.vexs[w]<<'\t';visit2[w]=1;i++;a[i]=G.vexs[w];}}v=LocateVex(G,a[j]);j++;//依次访问深度优先数组 }
}
int main()
{int v,choice;string vv; MGraph G;system("cls");cout<<"图的种类:1有向图 2无向图 3有向网 4无向网"<<endl<<"你的选择:";cin>>choice;switch(choice){case 1:{G.kind=DG;CreateDG(G);break; }case 2:{G.kind=UDG;CreateUDG(G);break; }case 3:{G.kind=DN;CreateDN(G);break; }case 4:{G.kind=UDN;CreateUDN(G);break; }} PrintAdjMatrix(G);cout<<"从哪个顶点开始遍历:"; cin>>vv;v=LocateVex(G,vv);cout<<"深度优先遍历:"; DFS(G,v);cout<<endl<<"广度优先遍历:"; BFS(G,v);return 0;
}/*
6 10
v1 v2 v3 v4 v5 v6
v1 v2 5
v2 v3 4
v3 v1 8
v1 v4 7
v3 v6 9
v6 v1 3
v4 v3 5
v4 v6 6
v6 v5 1
v5 v4 5*/
/*
7 8
A B C F L J M
A B
A C
A F
A L
B M
L J
L M
J M*/

邻接矩阵,构造有向图、无向图、有向网、无向网,深度优先、广度优先遍历(C++图)相关推荐

  1. 有向图的广度优先遍历_图的两种遍历方式

    1 引言 遍历是指从某个节点出发,按照一定的的搜索路线,依次访问对数据结构中的全部节点,且每个节点仅访问一次. 在二叉树基础中,介绍了对于树的遍历.树的遍历是指从根节点出发,按照一定的访问规则,依次访 ...

  2. 有向图、有向网、无向图、无向网

    #include<stdio.h> #include<stdlib.h> #include<limits.h> #include<string.h>#d ...

  3. 【数据结构】采用邻接矩阵表示法创建无向网、无向图、有向图、有向网

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 一.无向网(∞/权值,对称) 1.思路 2.代码 3.运行结果 三.其他 (1)无向图(0/1,对称) (2)有向网(∞/权值, ...

  4. 实现教材算法7.2利用邻接矩阵构造无向图的算法,在此基础上进行深度优先遍历和广度优先遍历。

    软件学院实验报告 姓名:              学号:              专业:               年级: 课程名称 数据结构 实验名称 实验9.图的遍历 实验的准备阶段 实验内 ...

  5. python 如何实现依据依存关系构造邻接矩阵(有向图)

    如何实现依据依存关系构造邻接矩阵(有向图) #!/usr/bin/env python # -*- encoding: utf-8 -*- ''' @Filename :depency_matix.p ...

  6. 使用邻接矩阵实现有向图最短路径Dijkstra算法

    题目描述: 用邻接矩阵存储有向图,实现最短路径Dijkstra算法,图中边的权值为整型,顶点个数少于10个. 输入描述 首先输入图中顶点个数和边的条数: 再输入顶点的信息(字符型): 再输入各边及其权 ...

  7. 数据结构—无向图创建邻接矩阵、深度优先遍历和广度优先遍历(C语言版)

    无向图创建邻接矩阵.深度优先遍历和广度优先遍历 一.概念解析: (1)无向图: (2)邻接矩阵: 二.创建邻接矩阵: 三.深度遍历.广度遍历 (1)深度遍历概念: (2)广度遍历概念: 四.实例展示 ...

  8. 分别用邻接矩阵和邻接表实现图的深度优先遍历和广度优先遍历_数据结构与算法学习笔记:图...

    图: 图结构区别于线性结构和树型结构,区别可见下图 逻辑上的图(graph)结构由顶点(vertex)和边(edge)组成. 一个图结构G包含顶点集合V和边集合E,任何两个顶点之间可以有一个边表示两者 ...

  9. Java实现无向图的邻接列表表示,深度遍历及广度遍历

    图 1. 图的表示 2. 图的分类 3. 图的表示 4. 图的遍历 5. 源码 5.1 图的邻接列表表示 5.1 邻接列表宽度优先.深度优先遍历 1. 图的表示 图用 G = (V,E)表示.V表示顶 ...

最新文章

  1. Android 手势—— GestureDetector 和 SimpleOnScaleGestureListener (手势缩放)
  2. c语言编写atm取款功能_21行C语言代码编写一个具备加密功能的聊天程序!网友:666...
  3. helm部署hadoop报错解决方法
  4. 枚举型是什么类型_金属缠绕垫片如何选用?A、B、C、D型都是什么类型?
  5. red6.4 mysql_rhel6.4 yum本地yum源配置
  6. 第六届省赛(软件类)真题----Java大学B组答案及解析
  7. 黄聪:UEditor如何在wordpress中调用
  8. 《Simbody Theory Manual》
  9. c语言口袋妖怪代码大全,口袋妖怪银版金手指代码使用大全
  10. vue获取屏幕高度赋值给div与获取div本身的高度
  11. 子网划分的计算与可用主机数
  12. 食品生产设备用什么清洗消毒效果比较好?
  13. 为什么要背诵新概念英语?
  14. 懒懒的Rain的寒假小结
  15. qpython3.0.0_QPython脚本引擎
  16. Vue 过滤器、计算属性、侦听器 图解版 一目了然
  17. 【bzoj4292】 [PA2015]Równanie 乱搞
  18. Python将Qt的ui文件转成py代码文件
  19. 设计模式(JAVA)
  20. 容器里有10升油,现在只有两个分别能装3升和7升油的瓶子,需要将10 升油等分成2 个5 升油。程序输出分油次数最少的详细操作过程

热门文章

  1. 网络安全需要掌握的知识有哪些?
  2. TDM到二向箔:阿里妈妈展示广告Match底层技术架构演进
  3. 从流水线角度看MIPS处理器ISA的实现逻辑以及RTOS操作系统仿真
  4. 关于虚拟机上fedora14不能上网的问题解决
  5. TensorFlow技术主管Peter Wardan:机器学习的未来是小而美
  6. freeCodeCamp “限制可能的用户名“ 练习
  7. Mux VLAN 原理
  8. 【SDL游戏编程入门第一卷】配置SDL环境
  9. [寻本溯源]“三羊开泰”的典故
  10. 高斯判别分析GDA的简单python实现