PTA 列出连通集

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

输入格式:

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

输出格式:

按照"{ v1​ v2​ ... 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 }
{ 6 }
结尾无空行

#include <iostream>
#include <stdbool.h>
#define Max 100
using namespace std;

bool visited[Max];

typedef struct ArcNode{
    int adjvex;
    struct ArcNode * nexttarc;
}ArcNode;
typedef struct Vnode{
    int data;
    ArcNode * firctarc;
}VNode,AdjList[Max];
typedef struct {
    AdjList vertices;
    int vexnum,arcnum;
}AlGraph;

void VisitFunc(AlGraph G,int v){
    cout<<G.vertices[v].data<<" ";
}

void DFS(AlGraph &G,int v){
    ArcNode *p;
    if(v<0||v>G.vexnum)
    return;
    else{
            visited[v]=true;
            p=G.vertices[v].firctarc;
            VisitFunc(G,v);
            while(p!=NULL){
                if(visited[p->adjvex]!=true)
                    DFS(G,p->adjvex);
                p=p->nexttarc;
            }
    }
    
}

void DFSTreaverse(AlGraph &G){
    int v;
    for(v=0;v<G.vexnum;v++)
        visited[v]=false;
    for(v=0;v<G.vexnum;++v){
        if(!visited[v]){
            cout<<"{ ";
            DFS(G,v); 
            cout<<"}"<<endl;
        } 
        
    }
}

void BFS(AlGraph &G,int v){
    int que[Max];int front=0;int rear=0;//队列
    int j;ArcNode *p=new ArcNode;
    VisitFunc(G,v);
    visited[v]=true;
    rear++;
    que[rear]=v;
    while(front!=rear){
        front++;
        j=que[front];
        p=G.vertices[j].firctarc;
        while(p!=NULL){
            if(visited[p->adjvex]==false){
                cout<<p->adjvex<<" ";
                visited[p->adjvex]=true;
                rear++;
                que[rear]=p->adjvex;
            }
            p=p->nexttarc;
        }
    }
}

void BFSTreaverse(AlGraph &G){
    int v;
    for(v=0;v<G.vexnum;v++)
        visited[v]=false;
    for(v=0;v<G.vexnum;++v){
        if(!visited[v]){
            cout<<"{ ";
            BFS(G,v); 
            cout<<"}"<<endl;
        } 
        
    }
}


int Position(AlGraph &G,int c){
    for(int i=0;i<G.vexnum;i++){
        if(G.vertices[i].data==c)
            return i;
    }
    return -1;
}
void CreatGraph(AlGraph &G){
    cin>>G.vexnum>>G.arcnum;
    for(int i=0;i<G.vexnum;i++){
        G.vertices[i].data=i;
        G.vertices[i].firctarc=NULL;
    }
    for(int i=0;i<G.arcnum;i++){
        int c1,c2;
        cin>>c1>>c2;
        int j=Position(G,c1);
        int k=Position(G,c2);
        ArcNode *p=new ArcNode;
        ArcNode *p_pre=new ArcNode;
        ArcNode *p1=new ArcNode;
        p1->adjvex=k;
        p=G.vertices[j].firctarc;
        p_pre=p;
        if(p==NULL){
            G.vertices[j].firctarc=p1;
            p1->nexttarc=p;
        }else{
            while((p1->adjvex)>(p->adjvex)){
                p_pre=p;
                p=p->nexttarc;
                if(p==NULL) break;
        }
            if(p==G.vertices[j].firctarc){
                p1->nexttarc=G.vertices[j].firctarc;
                G.vertices[j].firctarc=p1;
            }else{
                p1->nexttarc=p_pre->nexttarc;
                p_pre->nexttarc=p1;
            }//else
        }//else
              

        ArcNode *p2=new ArcNode;
        p2->adjvex=j;
        p=G.vertices[k].firctarc;
        p_pre=p;
        if(p==NULL){
            G.vertices[k].firctarc=p2;
            p2->nexttarc=p;
        }else{
            while((p2->adjvex)>(p->adjvex)){
                p_pre=p;
                p=p->nexttarc;
                if(p==NULL) break;
        }
            if(p==G.vertices[k].firctarc){
                p2->nexttarc=G.vertices[k].firctarc;
                G.vertices[k].firctarc=p2;
            }else{
                p2->nexttarc=p_pre->nexttarc;
                p_pre->nexttarc=p2;
            }//else
        }//else
    }

}


int main()
{
    AlGraph G;
    CreatGraph(G);
    DFSTreaverse(G);
    BFSTreaverse(G);
    return 0;
}

运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值