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

来源:互联网 发布:淘宝乐高日本代购 编辑:程序博客网 时间:2024/05/22 12:51
06-图1 列出连通集   (25分)

给定一个有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 60 70 12 04 12 43 5

输出样例:

{ 0 1 4 2 7 }{ 3 5 }{ 6 }{ 0 1 2 7 4 }{ 3 5 }

{ 6 }

#include<iostream>#include<cstdlib>#include<cstring>#include<queue>using namespace std;int flag[11];int n,m;typedef struct node *Graph;struct node{int Nv,Ne;int G[10][10];};Graph Create(){cin>>n>>m;Graph graph=(Graph)malloc(sizeof(struct node));graph->Nv=n;for(int i=0;i<m;i++){int a,b;cin>>a>>b;graph->G[a][b]=1;graph->G[b][a]=1;}return graph;}void dfs(Graph g,int x){cout<<x<<" ";flag[x]=1;for(int i=0;i<n;i++){if(g->G[x][i]==1&&!flag[i]){dfs(g,i);}}}void bfs(Graph g,int x){queue<int> q;q.push(x);flag[x]=1;cout<<x<<" ";while(!q.empty()){int temp=q.front();q.pop();for(int i=0;i<n;i++){if(g->G[temp][i]==1&&!flag[i]){flag[i]=1;q.push(i);cout<<i<<" ";}}}}int main(){Graph graph=Create();for(int i=0;i<n;i++){if(!flag[i]){cout<<"{ ";dfs(graph,i);    cout<<"}"<<endl;}}memset(flag,0,sizeof(flag));for(int i=0;i<n;i++){if(!flag[i]){cout<<"{ ";bfs(graph,i);cout<<"}"<<endl;}}return 0;}


0 0
原创粉丝点击