列出连通集 (25分)

    科技2022-07-16  105

    给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集。假设顶点从0到N−1编号。进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点。

    输入格式: 输入第1行给出2个整数N(0<N≤10)和E,分别是图的顶点数和边数。随后E行,每行给出一条边的两个端点。每行中的数字之间用1空格分隔。

    输出格式: 按照"{ v​1​​ v​2​​ … v​k​​ }"的格式,每行输出一个连通集。先输出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 } { 6 }

    #include <bits/stdc++.h> using namespace std; int e[15][15],book[15]; int a[15]; int t,n,m; /* 使用邻接矩阵e来存图, book数组标记点的遍历情况。 数组a来模拟栈,进行输出和bfs。 */ void bfs(int u) { int head=0,i; a[t++]=u; while(head<t) { int k=a[head]; for(i=0; i<n; i++) { if(e[k][i]==1&&book[i]==0) { a[t++]=i; book[i]=1; } } head++; } } void dfs(int u) { a[t++]=u; for(int i=0; i<n; i++) { if(e[u][i]==1&&book[i]==0) { book[i]=1; dfs(i); } } } int main() { int i,j,u,v; scanf("%d %d",&n,&m); memset(e,0,sizeof(0)); memset(book,0,sizeof(0)); for(i=1; i<=m; i++) { scanf("%d %d",&u,&v); e[u][v]=e[v][u]=1; } for(i=0; i<n; i++) { if(book[i]==0) { t=0; book[i]=1; dfs(i); printf("{ "); for(j=0; j<t; j++) printf("%d ",a[j]); printf("}\n"); } } memset(book,0,sizeof(book)); for(i=0; i<n; i++) { if(book[i]==0) { t=0; book[i]=1; bfs(i); printf("{ "); for(j=0; j<t; j++) printf("%d ",a[j]); printf("}\n"); } } return 0; }
    Processed: 0.014, SQL: 8