PAT--List Components (25)--BFS,DFS经典

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/grooowing/article/details/44900957

http://www.patest.cn/contests/mooc-ds2015spring/06-图1

觉得这题很经典,有利于理解BFS和DFS内部流程。

尤其注意打印位置,括号分出来打印,DFS里面只打印数字。。。

更新:

/*<span style="color:#ff0000;">20150406更新</span>
*后来又研究了一下BFS,哈哈,修改如下
*现在理解比较清楚了,你在visited[]=true处打印,
*肯定只访问一次啦。亲,我之前写的当笑话看啦,
*可以看到我的进步哟
*/
void BFS(int x){
	while(!Q.empty())Q.pop();
	Q.push(x);
	int i;
	visited[x]=true;///
	printf(" %d",x);
	while(!Q.empty()){
		int t=Q.front();
		Q.pop();
		for(i=0;i<n;i++){
			if(!visited[i] && map[i][t]==1){
				//printf("\nt,i:%d,%d",t,i);
				Q.push(i);
				visited[i]=true;
				printf(" %d",i);
			}
		}
	}
}


#include<stdio.h>
#include<queue>
using namespace std;

//地图
int map[10][10];
bool visited[10];
//BFS需要
queue<int> Q;

//初始化visited和Q
void init(){
	int i;
	for(i=0;i<10;i++){
		visited[i]=false;
	}
	while(!Q.empty())Q.pop();
}

//记录节点数
int n;
//深度优先,对应单个连通集
//注意visited[x]和printf的位置
void DFS(int x){
	visited[x]=true;
	printf(" %d",x);
	int i;
	for(i=0;i<n;i++){
		if(map[x][i]==1 && visited[i]==false){
			DFS(i);
		}
	}
}
//将每个连通集输出
void dfscom(){
	int i;
	for(i=0;i<n;i++){
		if(!visited[i]){
			printf("{");
			DFS(i);
			printf(" }\n");
		}
	}
}

//注意两个visited[]位置。
//一开始我只写一个visited,在print后,也就是打印相当于访问
//如下(错误的代码)
/*
void BFS(int x){
	while(!Q.empty())Q.pop();
	Q.push(x);
	int i;
	while(!Q.empty()){
		int t=Q.front();
		Q.pop();
		printf(" %d",t);
		visited[i]=true;//这样在打印前可能入队列很多次。。。。
		//建议可以在打印前判断是否是访问过。只不过会浪费一些队列位置
		for(i=0;i<n;i++){
			if(!visited[i] && map[i][t]==1){
				//printf("\nt,i:%d,%d",t,i);
				Q.push(i);
			}
		}
	}
}
*/

void BFS(int x){
	while(!Q.empty())Q.pop();
	Q.push(x);
	int i;
	visited[x]=true;///
	while(!Q.empty()){
		int t=Q.front();
		Q.pop();
		printf(" %d",t);
		for(i=0;i<n;i++){
			if(!visited[i] && map[i][t]==1){
				//printf("\nt,i:%d,%d",t,i);
				Q.push(i);
				visited[i]=true;
			}
		}
	}
}
void bfscom(){
	int i;
	for(i=0;i<n;i++){
		if(!visited[i]){
			printf("{");
			BFS(i);
			printf(" }\n");
		}
	}
}

	


int main(){
	init();
	int e;
	int i,j;
	for(i=0;i<10;i++){
		for(j=0;j<10;j++){
			map[i][j]=0;
		}
	}

	scanf("%d%d",&n,&e);
	while(e--){
		int t1,t2;
		scanf("%d%d",&t1,&t2);
		map[t1][t2]=1;
		map[t2][t1]=1;
	}
	dfscom();
	//注意初始化
	init();
	bfscom();
	return 0;
}
	


猜你喜欢

转载自blog.csdn.net/grooowing/article/details/44900957