图的邻接矩阵及遍历

/*****************************************************************************
DataStruct Of Graph
******************************************************************************/

#include <iostream>
#include <queue>
#include <stack>
using namespace std;
#include "stdafx.h"

const int MaxSize = 10;
template <class DataType>
class MGraph
{
private:
	int i,j,k;
	DataType vertex[MaxSize];
	int arc[MaxSize][MaxSize];
	int vertexNum,arcNum;
	int visited[MaxSize];
public:
	MGraph(DataType a[],int n,int e);
	~MGraph(){}
	void DFSTraverse(int v);
	void DFSN0Recursion(int v);
	void BFSTraverse(int v);
};
template <class DataType>
MGraph<DataType>::MGraph(DataType a[],int n,int e){
  vertexNum = n;arcNum = e;
  memset(visited,0,sizeof(visited));
  for(i=0;i<vertexNum;i++)
	  vertex[i]=a[i];
  for(i=0;i<vertexNum;i++)
	  for(j=0;j<vertexNum;j++)
		  arc[i][j]=0;
  for(k=0;k<arcNum;k++){
    cin>>i>>j;
	arc[i][j]=1;
	arc[j][i]=1;
  }
}

/图的邻接矩阵深度递归遍历

template <class DataType>
void MGraph<DataType>::DFSTraverse(int v){
 cout<<vertex[v];
 visited[v]=1;
 for(j=0;j<vertexNum;j++)
  if(arc[v][j]==1&&visited[j]==0)
	  DFSTraverse(j);
}

///图的邻接矩阵深度非递归遍历/
template <class DataType>
void MGraph<DataType>::DFSN0Recursion(int v){
	memset(visited,0,sizeof(visited));
	i=0;	
	stack<int> stack;
	cout<<vertex[v];
	visited[v]=1;
	stack.push(v);
	while(1){
	   while(i<=vertexNum){
			if(visited[i]==0&&arc[v][i]==1){
			  cout<<vertex[i];
			  stack.push(i);
			  visited[i]=1;
			  v=i;
			  i=0;
			}else{
			  i++;
			}
		}
	   stack.pop();
	   if(!stack.empty()){
		  v=stack.top();
	   }else{
	      return;
	   }
	}
}

///邻接矩阵广度非递归遍历///
template <class DataType>
void MGraph<DataType>::BFSTraverse(int v){
   memset(visited,0,sizeof(visited));
   queue<int> queue;
   cout<<vertex[v];
   visited[v]=1;
   queue.push(v);
   while(1){
	   for(i=0;i<vertexNum;i++){
		   if(arc[v][i]==1&&visited[i]==0){
		      cout<<vertex[i];
			  queue.push(i);
			  visited[i]=1;
		   }
	   }
	   queue.pop();
	   if(!queue.empty()){
	     v = queue.front();
	   }else{
	     return;
	   }
   }
}
///Main.cpp///
// MGraph.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "GMraph.h"

int _tmain(int argc, _TCHAR* argv[])
{
	int a[]={1,2,3,4},n=4,e=2;
	MGraph<int> mgraph(a,n,e);
	mgraph.DFSTraverse(0);
	cout<<endl<<"-----------------------我是万恶的分割线------------------"<<endl;
	mgraph.DFSN0Recursion(0);
	cout<<endl<<"-----------------------我是万恶的分割线------------------"<<endl;
	mgraph.BFSTraverse(0);
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值