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

来源:互联网 发布:amd显卡驱动linux 编辑:程序博客网 时间:2024/06/14 00:01

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


0 0
原创粉丝点击