【数据结构】(邻接矩阵 | 图 | DFS)邻接矩阵深度遍历图

在这里插入图片描述

#include < iostream >
using namespace std;

#define NUM 6

// 定义图 
typedef struct{

	int a[NUM][NUM]; // 表示点之间的关系 
	int vex[NUM];  // 各点存的信息 
}MGragh;

// 图的初始化 
void initGragh(MGragh &G, int w[][NUM], int v[])
{

	for(int i=0;i<NUM;i++){   //每个结点赋值!! 
	    G.vex[i] = v[i];
	}  
	for(int i=0;i<NUM;i++){
		for(int j=0;j<NUM;j++){
			G.a[i][j] = w[i][j];
		}
	}	
}

// 定义栈 
typedef struct{

	int data[NUM];
    int top;
	int stacksize;	
}stack;

// 建栈 
void initstack(stack &s)
{

	s.top = -1;
	s.stacksize = NUM;
}

// 判空
int emptystack(stack s)
{

	if(s.top == -1)
		return 1;
	else 
	    return 0;
} 

// 入栈
void push(stack &s,int e)
{

	if(s.top == s.stacksize-1){
		cout<<"the stack is full"<<endl;
		return;
	}
	s.data[++s.top] = e;
} 

// 出栈
void pop(stack &s,int &e)
{

	if(emptystack(s)){
		cout<<"the stack is empty"<<endl;
		return;
	}
	e = s.data[s.top--];
} 

void DFS(MGragh &G,int v)  // *output 实现数据双向传递 
{

	stack s;  // 函数里建栈 
	initstack(s); 
	int visit[NUM] = {0};  // 访问标志 
	int output[NUM];  // 存储访问下标序列 
	int p,i,j;
	
	p = v-1;    // p 为初始遍历结点的下标
	output[0] = p;  // 存入初始遍历结点的下标p
	visit[p] = 1;  // 置为 1 
	push(s,p);
	
	i = 1;  // 已遍历的结点数 
	while(1){  // 结点未遍历完 
		for(j=0;j<NUM;j++){   // 寻找临接点,且未被遍历 
			if(G.a[p][j]==1 && visit[j]==0){
				break;
			}
		}
		if(j<NUM){   // 找到邻接点 
			p = j;  // p 记录下标 
		    visit[p] = 1;
			output[i++] = p;
		    push(s,p);
		}
		else  // 即 j = NUM 
		{  // 没有邻接点,回溯 
			if(!emptystack(s)){
				pop(s,p);
				if(emptystack(s))
				    break;
				pop(s,p);
			    push(s,p);
			}	
			else 
			    break;
		}
	} 
	
	for(int i=0;i<NUM;i++){
    	cout<<G.vex[output[i]]<<" ";
    }
    cout<<endl;
}

int main()
{

	int a[][NUM] = { 0, 1, 1, 1, 0, 0,
                     1, 0, 0, 0, 1, 0,
                     1, 0, 0, 0, 1, 0,
                     1, 0, 0, 0, 0, 1,
                     0, 1, 1, 0, 0, 0,
                     0, 0, 0, 1, 0, 0}; 
    int b[NUM][NUM]= { 0,1,1,1,1,1,
				       1,0,0,0,0,0,
					   1,0,0,0,0,0,
			    	   1,0,0,0,0,0,
					   1,0,0,0,0,0,
					   1,0,0,0,0,0 };
					   
    int v[NUM] = {1,2,3,4,5,6};
    MGragh G;
    initGragh(G,a,v);
    DFS(G,4);

    return 0;
} 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值