給定一個有1編號。進行搜索時,假設我們總是從編號最小的頂點出發,按編號遞增的順序訪問鄰接點。 輸入格式: 輸入第1行給出2個整數N(0<N≤10)和E,分別是圖的頂點數和邊數。隨後E行,每行給出一條邊的兩個端點。每行中的數字之間用1空格分隔。 輸出格式: 按照{v1v2.....vk}的格式,每行輸 ...
給定一個有1編號。進行搜索時,假設我們總是從編號最小的頂點出發,按編號遞增的順序訪問鄰接點。
輸入格式:
輸入第1行給出2個整數N(0<N≤10)和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]) //點未訪問過 且 該邊存在 { 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]) //點未訪問過 且 該邊存在 { 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; }