图的基本操作(基于邻接矩阵):图的构造,深搜(DFS),广搜(BFS)
2024-08-26 09:27:01
#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;
}
图的结构如下:
最新文章
- 跟我从零基础学习Unity3D开发--初识U3D
- java读取项目根路径下和任意磁盘位置下的properties文件
- 我认识的log4j开源日志
- 深入理解Java虚拟机之读书笔记二 垃圾收集器
- PHP serialize &; JSON 解析
- 深入Linux网络核心堆栈(对于netfilter的用法和讲解)
- 2.目录:疯子讲iOS课程
- 数据库存储安全之(MD5+盐)加密
- ASP.NET MVC 3.0 Controller基础
- VS2010引用项目dll,编译时报错
- asp.net数据库操作类(一)
- Navigation Controller 创建方法
- Exchange 2010邮件服务器的搭建和部署
- [LeetCode] Image Overlap 图像重叠
- centos7 docker升级到最新稳定版本
- react 生命周期函数
- 详解CUDA编程
- Redisson实现分布式锁(一)
- node-sass:npm install node-sass --save
- api.closeFrame