PAT--List Components (25)--BFS,DFS經典
阿新 • • 發佈:2019-01-14
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; }