PTA-列出连通集(DFS+BFS)

来源:互联网 发布:tensorflow whl 编辑:程序博客网 时间:2024/06/05 19:50

列出连通集   (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 <cstring>#include <queue>using namespace std;int n,m,v[11],Map[11][11];void DFS(int x){    cout<<' '<<x;    for(int i=0; i<n; i++)    {        if(!v[i]&&Map[x][i]==1)        {            v[i]=1;            DFS(i);        }    }}void BFS(int x){    int y;    queue<int>Q;    Q.push(x);    while(!Q.empty())    {        y=Q.front();        cout<<' '<<y;        Q.pop();        for(int i=0; i<n; i++)        {            if(!v[i]&&Map[y][i]==1)            {                v[i]=1;                Q.push(i);            }        }    }}int main(){    int x,y;    cin>>n>>m;    memset(Map,0,sizeof(Map));    memset(v,0,sizeof(v));    while(m--)    {        cin>>x>>y;        Map[x][y]=Map[y][x]=1;    }    for(int i=0; i<n; i++)    {        if(v[i]==0)        {            v[i]=1;            cout<<"{";            DFS(i);            cout<<" }"<<endl;        }    }    memset(v,0,sizeof(v));    for(int i=0; i<n; i++)    {        if(v[i]==0)        {            v[i]=1;            cout<<"{";            BFS(i);            cout<<" }"<<endl;        }    }    return 0;}

原创粉丝点击