问题描述
采用邻接矩阵表示无向图,完成图的创建、图的深度优先遍历、图的广度优先遍历操作。其中图的顶点信息是字符型,图中顶点序号按字符顺序排列。本输入样例中所用的图如下所示:
输入描述
第一行输入两个值,第一个是图中顶点的个数,第二个是图中边的条数
第二行输入各顶点的信息,即输入每个顶点字符
第三行开始输入每条边,每条边的形式为两个顶点的序号,中间以空格隔开,输入完一条边换行
输出描述
首先输出图的顶点信息,输出完毕换行
接着输出图的邻接矩阵,假如图中有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
问题分析
首先需要知道邻接矩阵是怎样表示,如果由n个顶点,那么其邻接矩阵就是n*n的方阵,如果某两个顶点之间存在边,那么对应的矩阵位置应该是1,否则是0。
邻接矩阵用二维数组表示,初始化的时候要全部初始化为0.
代码
#include<iostream>
using namespace std;
const int MaxSize = 10;
template <typename DataType>
class Text
{
public:
Text(); //构造函数
void DETraverse(int v); //深度优先遍历
void BFTraverse(int v); //广度优先遍历
void ShowVerTex();
void ShowGraph();
void Initia();
int visited[MaxSize];
int vertexNum,EdgeNum; //储存点的个数和边的个数
void Strech(int k);
private:
DataType vertex[MaxSize]; //储存顶点
int edge[MaxSize][MaxSize]; //储存边
};
template <typename DataType>
void Text<DataType>::ShowGraph() //输出邻接矩阵
{
for(int x = 0;x < vertexNum;x++)
{
for(int y = 0;y < vertexNum; y++)
{
if(edge[x][y] != 0 && edge[x][y] != 1)
{
cout << 0 << " ";
}
else
{
cout << edge[x][y] << " ";
}
}
cout << endl;
}
}
template <typename DataType>
void Text<DataType>::ShowVerTex()
{
for(int i = 0; i < vertexNum;i++)
{
cout << vertex[i] << " ";
}
cout << endl;
}
template <typename DataType>
Text<DataType>::Text()
{
int i,j,k;
cin >> vertexNum >> EdgeNum;
if(vertexNum == 0)
{
return;
}
else
{
for(i = 0;i < vertexNum;i++) //将顶点存入对应数组
{
cin >>vertex[i];
visited[i] = 0; //将是否被访问过的标记设为否也就是0
}
for(j = 0;j < vertexNum;j++)
{
for(k = 0;k < vertexNum;k++)
{
edge[j][k] = 0; //将所有邻接边全部初始化为0
}
}
for(k = 0;k < EdgeNum; k++)
{
cin >> i >> j; //无向图将i->j\j->i 数据设为1
edge[i][j] = 1;
edge[j][i] = 1;
}
}
}
template <typename DataType>
void Text<DataType>::Initia()
{
for(int j = 0; j < vertexNum; j++)
{
visited[j] = 0;
}
}
template <typename DataType>
void Text<DataType>::DETraverse(int v) //广度优先遍历
{
cout << vertex[v] << " ";
visited[v] = 1;
for(int i = 0;i < vertexNum; i++)
{
if(edge[v][i] == 1 && visited[i] == 0)
{
DETraverse(i);
}
}
}
template <typename DataType>
void Text<DataType>:: BFTraverse(int v)
{
int front,root,w;
front = -1;
root = -1;
cout << vertex[v] << " ";
visited[v] = 1;
int Q[MaxSize];
root++;
Q[root] = v;
while(front != root)
{
front++;
w = Q[front];
for(int i = 0;i < vertexNum; i++)
{
if(edge[w][i] == 1 && visited[i] == 0)
{
cout << vertex[i] << " ";
visited[i] = 1;
root++;
Q[root] = i;
}
}
}
//做成一个递归
root = front = -1;
for(int k = 0;k < vertexNum; k++)
{
if(visited[k] == 0)
{
cout << vertex[k] << " ";
visited[k] = 1;
Strech(k);
root++;
Q[root] = k;
}
}
}
template <typename DataType>
void Text<DataType>::Strech(int k)
{
int w,root,front;
root = front = -1;
int Q[MaxSize];
while(root != front)
{
front++;
w = Q[front];
for(int l = 0;l < vertexNum; l++)
{
if(edge[w][l] == 1 && visited[l] == 0)
{
cout << vertex[l] << " ";
visited[l] = 1;
root++;
Q[root] = l;
}
}
}
}
int main()
{
Text<char> t;
if(t.vertexNum == 0) //判断是否输入了顶点
{
return 0;
}
else
{
t.ShowVerTex();
t.ShowGraph();
for(int i = 0;i < t.vertexNum; i++)
{
if(t.visited[i] == 0)
{
t.DETraverse(i);
}
}
cout << endl;
t.Initia();
t.BFTraverse(0);
return 0;
}
}