dfs和bfs遍历生成树

dfs


void dfs(char s[],int arc[][35],int v[],int n,int x){
//顶点字符串、边、已经遍历过的顶点、顶点个数、当前遍历的顶点的下标
	v[x]=1;
	for(int i=0;i<n;i++){
		if(arc[x][i]&&!v[i]){//顶点i与顶点x有边且i尚未遍历
			dfs(s,arc,v,n,i);//遍历顶点x的每一个邻接点
		}
	}	
}

bfs


void bfs(char s[],int arc[][35],int v[],int n,int x){//对顶点x广度优先遍历
	int front=-1,rear=-1;
	int q[100];//存下标!! 
	q[++rear]=x;//a[x]入队 
	v[x]=1;
	while(front!=rear){
		front++;
		for(int i=0;i<n;i++){//存入front的邻接点(出队的那个顶点的邻接点) 
			if(!v[i]&&arc[q[front]][i]){//不是front,是q[front]:下标!!
			//顶点i尚未入队且i与顶点q[front]有边
				q[++rear]=i;//i入队
				v[i]=1;//标记i已入队
			}
		}
	}
	
}

实例

广度优先生成树

Time Limit: 1000/2000 MS (C/Others)   Memory Limit: 32768/32768 K (C/Others)
Problem Description:
设有一连通无向图,其顶点值为字符型并假设各值互不相等,采用邻接矩阵表示法存储表示。利用BFS算法求其广度优先生成树(从下标0的顶点开始遍历),并在遍历过程中输出广度优先生成树的每一条边。

Input:
有多组测试数据,每组数据的第一行为两个整数n和e,表示n个顶点和e条边(0<n<20);第二行为其n个顶点的值,按输入顺序进行存储;后面有e行,表示e条边的信息,每条边信息占一行,包括边所依附的顶点下标i和j,数据之间用空格隔开。

Output:
输出广度优先生成树的每一条边,每条边信息之后均有一空格,每组输出占一行,具体格式见样例。

Sample Input:
4 4
ABCD
0 1
0 3
1 2
1 3
Sample Output:
(A,B) (A,D) (B,C)
Hint:
Source:

代码

#include<iostream>
using namespace std;
void dfs(char a[],int arc[][35],int s[],int n,int x){
	cout<<a[x];
	s[x]=1;
	for(int i=0;i<n;i++){
		if(arc[x][i]&&s[i]==0){
			arc[x][i]=arc[i][x]=0;
			dfs(a,arc,s,n,i);
		}
	}	
}
void bfs(char a[],int arc[][35],int s[],int n,int x){
	int front=-1,rear=-1;
	int q[100];//存下标 
	q[++rear]=x;//a[x]入队 
	s[x]=1;
	while(front!=rear){
		cout<<a[q[++front]];
		for(int i=0;i<n;i++){//存入front的邻接点(出队的那个的邻接点) 
		//	cout<<"arc["<<q[front]<<"]["<<i<<"]:"<<arc[front][i]<<endl;
			if(!s[i]&&arc[q[front]][i]){
		//		cout<<"i:"<<i<<endl; 
				q[++rear]=i;
				s[i]=1;
			}
		}
	}
	
}
int main(){
	int n,e;
	while(cin>>n>>e){
		char s[30];
		int arc[35][35]={0};
		cin>>s;
		int a,b;
		while(e--){
			cin>>a>>b;
			arc[a][b]=arc[b][a]=1;
		}
		int ss[30]={0};
		dfs(s,arc,ss,n,0);
		cout<<endl;
	}
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值