无向图的邻接矩阵表示法验证程序

问题描述

采用邻接矩阵表示无向图,完成图的创建、图的深度优先遍历、图的广度优先遍历操作。其中图的顶点信息是字符型,图中顶点序号按字符顺序排列。本输入样例中所用的图如下所示:
输入描述
第一行输入两个值,第一个是图中顶点的个数,第二个是图中边的条数
第二行输入各顶点的信息,即输入每个顶点字符
第三行开始输入每条边,每条边的形式为两个顶点的序号,中间以空格隔开,输入完一条边换行
输出描述
首先输出图的顶点信息,输出完毕换行
接着输出图的邻接矩阵,假如图中有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;
	}
	
}
发布了67 篇原创文章 · 获赞 3 · 访问量 1896

猜你喜欢

转载自blog.csdn.net/lfanyize/article/details/103402554