06-图1 列出连通集 (25分)

xiaoxiao2021-02-28  112

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

输入格式:

输入第1行给出2个整数NN(0<N\le 100<N10)和EE,分别是图的顶点数和边数。随后EE行,每行给出一条边的两个端点。每行中的数字之间用1空格分隔。

输出格式:

按照"{ v_1v1 v_2v2 ... v_kvk }"的格式,每行输出一个连通集。先输出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 }

好好背模板!

代码部分注释下就能运行,懒得写2部分了

#include<stdio.h> #include<queue> using namespace std; int map[10][10];//邻接矩阵 int vis[10]={0};//节点未访问 int inq[10]={0};//节点未进入队列 void dfs(int s,int n){ printf(" %d",s); vis[s]=1; int i; for(i=0;i<n;i++){ if(vis[i]==0&&map[s][i]==1){ dfs(i,n); } } } void dfstravel(int n){ int i; for(i=0;i<n;i++){ if(vis[i]==0){ printf("{"); dfs(i,n); printf(" }\n"); } } } void bfs(int s,int n){ queue<int>q; q.push(s); inq[s]=1; while(!q.empty()){ int u=q.front(); printf(" %d",u); q.pop(); int i; for(i=0;i<n;i++){ if(inq[i]==0&&map[u][i]==1){ q.push(i); inq[i]=1; } } } } void bfstravel(int n){ int i; for(i=0;i<n;i++){ if(inq[i]==0){ printf("{"); bfs(i,n); printf(" }\n"); } } } int main(){ int n,e,i,j; scanf("%d %d",&n,&e); for(i=0;i<n;i++){ for(j=0;j<n;j++){ map[i][j]=0; } } int a,b; while(e--){ scanf("%d %d",&a,&b); map[a][b]=1; map[b][a]=1; } dfstravel(n); bfstravel(n); }

转载请注明原文地址: https://www.6miu.com/read-34837.html

最新回复(0)