/*****************************************************************************
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;
}