1. 程式人生 > >PAT--List Components (25)--BFS,DFS經典

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

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