采用邻接矩阵表示无向图,完成图的创建、图的深度优先遍历、图的广度优先遍历操作。其中图的顶点信息是字符型,图中顶点序号按字符顺序排列。本输入样例中所用的图如下所示:
输入描述
第一行输入两个值,第一个是图中顶点的个数,第二个是图中边的条数 第二行输入各顶点的信息,即输入每个顶点字符 第三行开始输入每条边,每条边的形式为两个顶点的序号,中间以空格隔开,输入完一条边换行
输出描述
首先输出图的顶点信息,输出完毕换行 接着输出图的邻接矩阵,假如图中有n个顶点,则输出形式为n行n列的邻接矩阵,输出完毕换行 接下来一行输出从图的第一个顶点开始进行深度优先遍历的序列,中间以空格隔开,输出完毕换行 最后一行输出从图的第一个顶点开始进行广度优先遍历的序列,中间以空格隔开,输出完毕换行
输入样例
5 7 A B C D E 0 1 0 2 0 3 1 2 1 3 2 4 3 4
输出样例
A B C D E 0 1 1 1 0 1 0 1 1 0 1 1 0 0 1 1 1 0 0 1 0 0 1 1 0 A B C E D A B C D E
思路:避坑啊同学们,这个图不可能只有单连通的,他可能有多个连通分量,所以在遍历的时候要每个结点都要遍历一次,如果只从一个起始结点遍历的话只能通过25%的测试案例。同时注意格式问题,输出后的空行去掉才能AC,不然会显示格式错误!!!
#include<iostream>
#define MAXSIZE 10
using namespace std;
int visited[MAXSIZE] = { 0 };
class MGraph
{
public:
MGraph(char a[], int n, int e);
public:
void DFtraverse(int v);
void BFtraverse(int v, int n);
void Print_Vertex();
void Print_Edge();
private:
char vertex[MAXSIZE];
int edge[MAXSIZE][MAXSIZE];
int VertexNum, EdgeNum;
};
//构造函数
MGraph::MGraph(char a[], int n, int e)
{
int i, j, k;
VertexNum = n;
EdgeNum = e;
for (i = 0; i < VertexNum; i++)
vertex[i] = a[i];
for (i = 0; i < VertexNum; i++)
for (j = 0; j < VertexNum; j++)
edge[i][j] = 0;
for (k = 0; k < EdgeNum; k++)
{
cin >> i >> j;
edge[i][j] = 1;
edge[j][i] = 1;
}
}
//深度优先遍历(栈结构-递归)
void MGraph::DFtraverse(int v)
{
cout << vertex[v] << ' ';
visited[v] = 1;
for (int j = 0; j < VertexNum; j++)
{
if (edge[v][j] == 1 && visited[j] == 0)
DFtraverse(j);
}
}
//广度优先遍历(队列结构)
void MGraph::BFtraverse(int v, int n)
{
int w, j, Q[MAXSIZE];
int front = -1; int rear = -1;
cout << vertex[v] << " "; visited[v] = 1;
Q[++rear] = v;
while (front != rear)
{
w = Q[++front];
for (j = 0; j < VertexNum; j++)
if (edge[w][j] == 1 && visited[j] == 0)
{
cout << vertex[j] << " ";
visited[j] = 1;
Q[++rear] = j;
}
}
}
void MGraph::Print_Edge()
{
int i, j;
for (i = 0; i < VertexNum; i++)//初始化邻接矩阵
{
for (j = 0; j < VertexNum; j++)
cout << edge[i][j] << ' ';
// cout << endl;
}
}
void MGraph::Print_Vertex()
{
for (int i = 0; i < VertexNum; i++)
cout << vertex[i] << ' ';
// cout << endl;
}
void Init(int n)
{
int i;
for (i = 0; i < n; i++)
visited[i] = 0;
}
int main()
{
int i;
int n, e;
char ch[MAXSIZE];
cin >> n >> e;
for (i = 0; i < n; i++)
cin >> ch[i];
MGraph MG(ch, n, e);
MG.Print_Vertex();
MG.Print_Edge();
for (int i = 0; i < n; i++)
{
if (visited[i] == 0)
{
MG.DFtraverse(i);
}
}
//cout << endl;
Init(n);
for (int i = 0; i < n; i++)
{
if (visited[i] == 0)
{
MG.BFtraverse(i,n);
}
}
// cout << endl;
return 0;
}