1. 程式人生 > >【PTA-天梯賽訓練】列出連通集

【PTA-天梯賽訓練】列出連通集

tst eof gpo bits space names sca include div

給定一個有1編號。進行搜索時,假設我們總是從編號最小的頂點出發,按編號遞增的順序訪問鄰接點。

輸入格式:

輸入第1行給出2個整數N(0<N10)和E,分別是圖的頂點數和邊數。隨後E行,每行給出一條邊的兩個端點。每行中的數字之間用1空格分隔。

輸出格式:

按照{v1v2.....vk}的格式,每行輸出一個連通集。先輸出DFS的結果,再輸出BFS的結果。

輸入樣例:

8 6
0 7
0 1
2 0
4 1
2 4
3 5

輸出樣例:

{ 0 1 4 2 7 }
{ 3 5 }
{ 6 }
{ 0 1 2 7 4 }
{ 3 5 }
#include<bits/stdc++.h>
using
namespace std; int G[15][15],vis[15]; int n,m; void dfs(int u) { int i; printf(" %d",u); for(i=0;i<n;i++) if(!vis[i]&&G[u][i]) //點未訪問過 且 地圖上標記不為0 { vis[i]=1; //訪問完,標記為1 dfs(i); //繼續深搜 } } void bfs(int u) { int i; queue
<int> q; q.push(u); //將u加入隊列q while(!q.empty()) //如果隊列不為空 { u=q.front(); //取隊首的元素 q.pop(); //隊首元素出隊 printf(" %d",u); for(i=0;i<n;i++) if(!vis[i]&&G[u][i]) //點未訪問過 且 地圖上標記不為0 { vis[i]
=1; //訪問完,標記為1 q.push(i); //將i加入隊列q } } } int main() { int i,u,v; scanf("%d%d",&n,&m); //n個頂點,m條邊 for(i=0;i<m;i++) { scanf("%d%d",&u,&v); //每條邊的兩個頂點u、v G[u][v]=G[v][u]=1; //u-v和v-u標記為1 } memset(vis,0,sizeof(vis)); for(i=0;i<n;i++) if(!vis[i]) { printf("{"); vis[i]=1; //訪問完,標記為1 dfs(i); //深搜i printf(" }\n"); } memset(vis,0,sizeof(vis)); for(i=0;i<n;i++) if(!vis[i]) { printf("{"); vis[i]=1; //訪問完,標記為1 bfs(i); //廣搜i printf(" }\n"); } return 0; }

【PTA-天梯賽訓練】列出連通集