版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}