邻接矩阵
#include<bits/stdc++.h>
using namespace std;
typedef char VertexType;/*顶点类型应由用户定义*/
typedef int EdgeType; /*边上的权值类型应该由用户定义*/
#define MAXSIZE 9 /* 存储空间初始分配量*/
#define MAXEDGE 15
#define MAXVEX 9
typedef struct{
int numVertexes , numEdges;/*顶点数和边数*/
VertexType vexs[MAXVEX];/*顶点表*/
EdgeType arc[MAXVEX][MAXVEX];/*邻接矩阵,可看做边表*/
}MGraph;
bool visited[MAXVEX];/*访问标志的数组*/
queue<int> Q;/*存储顶点序列的栈*/
/*邻接矩阵的广度优先递归算法*/
void BFS(MGraph MG,int i){
visited[i] = true;
Q.push(i);
while(!Q.empty()){
int j=Q.front();
cout<<MG.vexs[j]<<' ';/*打印顶点,也可以其他操作*/
Q.pop();
for(int k=0;k<MG.numVertexes;k++){
if(visited[k] == false && MG.arc[j][k] ==1){
visited[k] = true;
Q.push(k);
}
}
}
}
/*邻接矩阵的广度遍历操作*/
void BFSTravrrse(MGraph MG){
int i;
for(i =0;i<MG.numVertexes;i++)
visited[i] =false;/*初始所有顶点状态都是未访问的状态*/
for(i = 0;i<MG.numVertexes;i++)
if(!visited[i])
BFS(MG,i);/*对未访问过的顶点调用BFS,若是连通图,只会执行一遍*/
}
/* 建立无向网图的邻接矩阵表示 */
void CreateMGraph(MGraph *Gp){
int i,j,k,w;
cout << "请输入顶点数和边数(空格分隔):" << endl;
cin >> Gp->numVertexes >> Gp->numEdges;
cout<<"请输入顶点name"<<endl;
for(i = 0;i<Gp->numVertexes;i++)
cin>>Gp->vexs[i];
for(i = 0;i<Gp->numEdges;i++){
for(j = 0;j<Gp->numEdges;j++){
if(i == j) Gp->arc[i][j]=0;//没有自环
else Gp->arc[i][j] = INFINITY;//初始化
}
}
for(k = 0;k < Gp->numEdges;k++){
cout<<"请输入边(vi, vj)的上标i,下标j和权值w(空格分隔):" << endl;
cin>> i >> j >> w;
Gp->arc[i][j] = w;
Gp->arc[j][i] = w; /* 因为是无向图,矩阵对称 */
}
}//虽然根据对称矩阵说可以压缩一半空间,数量级未改变,且牺牲时间
int main(){
MGraph MG;
CreateMGraph(&MG);
BFSTravrrse(MG);
system("pause");
return 0;
}
这里权重为1,一是为了方便修改其他操作,而是作者是从作者自己的邻接表加上BFS 形成可运行代码
邻接表
#include<bits/stdc++.h>
using namespace std;
typedef char VertexType;/*顶点类型应由用户定义*/
typedef int EdgeType; /*边上的权值类型应该由用户定义*/
#define MAXSIZE 9 /* 存储空间初始分配量*/
#define MAXEDGE 15
#define MAXVEX 9
/* 邻接表结构****************** */
typedef struct EdgeNode /* 边表结点 */
{
int adjvex; /* 邻接点域,存储该顶点对应的下标 */
int weight; /* 用于存储权值,对于非网图可以不需要 */
struct EdgeNode *next; /* 链域,指向下一个邻接点 */
} EdgeNode;
typedef struct VertexNode /* 顶点表结点 */
{
int in; //结点入度
char data; /* 顶点域,存储顶点信息 */
EdgeNode *firstedge; /* 边表头指针 */
} VertexNode, AdjList[MAXVEX];
typedef struct
{
AdjList adjList;
int numVertexes, numEdges; /* 图中当前顶点数和边数 */
} GraphAdjList;
bool visited[MAXVEX];/*访问标志的数组*/
queue<int> Q;/*存储顶点序列的栈*/
/*邻接表的广度优先递归算法*/
void BFS(GraphAdjList *MG,int i){
visited[i] = true;
Q.push(i);
while(!Q.empty()){
int j=Q.front();
//cout<<MG.vexs[j]<<' ';/*打印顶点,也可以其他操作*/
cout << MG->adjList[i].data << ' ';/*打印顶点,也可以其他操作*/
Q.pop();
EdgeNode *p;
p = MG->adjList[i].firstedge;
while (p){
if (!visited[p->adjvex])
BFS(MG, p->adjvex); /* 对为访问的邻接顶点递归调用 */
p = p->next;
}
}
}
/*邻接表的广度遍历操作*/
void BFSTravrrse(GraphAdjList MG){
int i;
for(i =0;i<MG.numVertexes;i++)
visited[i] =false;/*初始所有顶点状态都是未访问的状态*/
for(i = 0;i<MG.numVertexes;i++)
if(!visited[i])
BFS(&MG,i);/*对未访问过的顶点调用BFS,若是连通图,只会执行一遍*/
}
void CreateALGraph(GraphAdjList *Gp)
{
int i, j, k;
EdgeNode *pe;
cout << "输入顶点数和边数(空格分隔):" << endl;
cin >> Gp->numVertexes >> Gp->numEdges;
cout << "输入顶点信息:" << endl;
for (i = 0 ; i < Gp->numVertexes; i++)
{
cin >> Gp->adjList[i].data;
Gp->adjList[i].firstedge = NULL; /* 将边表置为空表 */
}
for (k = 0; k < Gp->numEdges; k++) /* 建立边表 */
{
cout << "输入边(vi,vj)的顶点序号i,j(空格分隔):" << endl;
cin >> i >> j;
pe = (EdgeNode *)malloc( sizeof(EdgeNode));
pe->adjvex = j; /* 邻接序号为j */
/* 将pe的指针指向当前顶点上指向的结点 */
pe->next = Gp->adjList[i].firstedge;
Gp->adjList[i].firstedge = pe; /* 将当前顶点的指针指向pe */
pe = (EdgeNode *)malloc( sizeof(EdgeNode));
pe->adjvex = i;
pe->next = Gp->adjList[j].firstedge;
Gp->adjList[j].firstedge = pe;
}
}
int main(){
GraphAdjList MG;
CreateALGraph(&MG);
BFSTravrrse(MG);
system("pause");
return 0;
}
作者确实太懒了,连一个换行都不愿意写