#include "stdafx.h"
#include<iostream>
#include<queue>
using namespace std;
#define INFINITY 0
#define MAX_VERTEX_NUM 10 //最大顶点数
#define MAX_EDGE_NUM 45 //最大边数
typedef enum{DG,DN,UDG,UDN}Graphkind; //图的类型
typedef char VertexType; //定点向量类型
int visited[MAX_VERTEX_NUM];
typedef struct
{
VertexType vexs[MAX_VERTEX_NUM]; //定义定点向量
int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; //定义邻接矩阵
int vexnum,arcnum; //图的当前顶点数和边数
Graphkind kind; //图的种类标志
}MGraph;
int LocateVex(MGraph g,VertexType v) //求v在图g中的位置,若v不存在则返回-1
{
int i=0;
while(i<g.vexnum && g.vexs[i]!=v)
i++; //顺序查找
if(i<g.vexnum)
return i; //查找成功
else
return -1; //查找不成功
}
int CreateUdn(MGraph &g) //创建无向图的数组表示
{
VertexType v1,v2; //边的两个邻接定点
int w; //边的权值
int x,y; //边的横竖坐标
cout<<"请输入图的顶点数:";
cin>>g.vexnum;
cout<<"请输入图的边数:";
cin>>g.arcnum;
cout<<"请输入顶点向量:";
for(int s=0;s<g.vexnum;s++) //定义定点向量
cin>>g.vexs[s];
for(int i=0;i<g.vexnum;i++) //初始化邻接矩阵
{
for(int j=0;j<g.vexnum;j++)
{
g.arcs[i][j]=INFINITY;
}
}
for(int k=1;k<=g.arcnum;k++) //确定边和边的权值
{
cout<<"请输入边依附的两个定点:";
cin>>v1>>v2;
x=LocateVex(g,v1); //确定顶点的位置
y=LocateVex(g,v2);
cout<<"请输入该边的权值:";
cin>>w;
if(x<0||y<0) //找不到定点
return -1;
g.arcs[x][y]=g.arcs[y][x]=w;
}
}
void DisplayMGraph(MGraph g) //显示图的邻接矩阵
{
cout<<"图的邻接矩阵为:"<<endl;
for(int i=0;i<g.vexnum;i++)
{
for(int j=0;j<g.vexnum;j++)
cout<<" "<<g.arcs[i][j];
cout<<endl;
}
}
int firstadj(MGraph g,int i) //求序号为i的顶点的第一个邻接顶点
{
int j=0;
while(j<g.vexnum)
{
if(g.arcs[i][j]==1)
return j;
else
j++;
}
return -1; //v无邻接顶点
}
int nextadj(MGraph g,int i,int j) //求序号为i的顶点的下一个邻接顶点
{
int k=j+1;
while(k<g.vexnum)
{
if(g.arcs[i][k]==1)
return k;
else
k++;
}
return -1;
}
void dfs(MGraph g,int v) //v为顶点序号,不是顶点值,从g中顶点出发深度优先遍历
{
visited[v]=1;
cout<<g.vexs[v]<<" "; //访问第v个顶点
for(int w=firstadj(g,v);w>=0;w=nextadj(g,v,w))
{
if(!visited[w]) //对v的尚未访问的邻接顶点w递归调用dfs
dfs(g,w);
}
}
void dfsTraverse(MGraph g) //对图做深度优先遍历
{
for(int i=0;i<g.vexnum;i++) //访问标志数组初始化
visited[i]=0;
for(int j=0;j<g.vexnum;j++)
if(!visited[j]) //对尚未访问的顶点调用dfs
dfs(g,j);
}
void bfs(MGraph g,int i) //对图做广度优先遍历
{
queue<int>q; //初始化队列
q.push(i); //进队列
visited[i]=1; //访问过
cout<<g.vexs[i]<<" ";
while(!q.empty())
{
i=q.front();
q.pop();
for(int j=0;j<g.vexnum;j++) //遍历相关联的边
if(g.arcs[i][j]&&!visited[j])
{
q.push(j); //进队列
visited[j]=1; //访问
cout<<g.vexs[j]<<" ";
}
}
}
void bfsTraverse(MGraph g)
{
for(int i=0;i<g.vexnum;i++)
visited[i]=0;
for(int j=0;j<g.vexnum;j++)
if(!visited[j])
bfs(g,j);
}
void main()
{
MGraph G;
CreateUdn(G);
DisplayMGraph(G);
cout<<"深度优先遍历的结果为: ";
dfsTraverse(G);
cout<<endl;
cout<<"广度优先遍历的结果为:";
bfsTraverse(G);
cout<<endl;
}