06-图1. List Components

For a given undirected graph with N vertices and E edges, please list all the connected components by both DFS and BFS. Assume that all the vertices are numbered from 0 to N-1. While searching, assume that we always start from the vertex with the smallest index, and visit its adjacent vertices in ascending order of their indices.

Input Specification:

Each input file contains one test case. For each case, the first line gives two integers N (0

#include<stdio.h>
#include<stdlib.h>

int Qp = 0,top = 0,end = 1;
typedef struct {
    int Visited[10];
    int Edges[10][10];
    int VertexN,EdgeN;
}Graph; 

int DFS(Graph* G,int V);
int InitializeG(Graph* G);
int ReadG(Graph* G);
int DeleteQ(int* Q);
int AddQ(int* Q,int k);
int Find(int* Q,int k);
int BFS(Graph* G,int* Q,int v);

int main(){
    int k = 0,i,p; 
    Graph* G;
    G = (Graph*)malloc(sizeof(Graph));
    InitializeG(G); 
    ReadG(G);

    p = 0;
    do{
        printf("{ ");
        DFS(G,k);
        printf("}\n");
        for(i = 0,p = 0;i<G->VertexN;p = 0,i++)
            if(0 == G->Visited[i]){
                p = 1;
                k = i;
                break;
            }

    }while(p);

    for(i = 0,p = 0;i<G->VertexN;i++){
        G->Visited[i] = 0;
    }
    int Q[10] = {0};
    k = p = 0;
    do{
        printf("{ ");
//      注意队列的初始化 
        Qp = 0;
        top = 0;
        end = 1;
        BFS(G,Q,k);
        printf("}\n");
        for(i = 0,p = 0;i<G->VertexN;p = 0,i++)
            if(0 == G->Visited[i]){
                p = 1;
                k = i;
                break;
            }

    }while(p);

    return 0;
}

int BFS(Graph* G,int* Q,int v){
    int i,j,k;
    AddQ(Q,v);

    for(i = v;end != top;){
        for(j = 0;j<G->VertexN;j++){
            if(G->Edges[i][j] && !G->Visited[j]){
                if(!Find(Q,j))
                    AddQ(Q,j); 
            }
        }
        k = DeleteQ(Q);
        G->Visited[k] = 1;
        printf("%d ",k);
        i = Q[top];
    }


    return 0;
}

int Find(int* Q,int k){
    int i = top + 1;
    for(;i<end;i++)
        if(Q[i] == k)
            return 1;
    return 0;
}

int AddQ(int* Q,int k){
    if(top == 0 && !Qp){
        Q[top] = k;
        Qp++;
        return 0;
    }
    else
        Q[end++] = k;


    return 0;
}

int DeleteQ(int* Q){
    int k;
    k = Q[top++];

    return k;
}

int DFS(Graph* G,int V){
    int W;
    printf("%d ",V);
    G->Visited[V] = 1;
    for(W = 0;W<G->VertexN;W++){
        if(G->Edges[V][W] && !G->Visited[W])
            DFS(G,W);
    }

    return 0;
}

int ReadG(Graph* G){
    int i,V1,V2;
    scanf("%d%d",&G->VertexN,&G->EdgeN);
    for(i = 0;i<G->EdgeN;i++){
        scanf("%d%d",&V1,&V2);
        G->Edges[V1][V2] = G->Edges[V2][V1] = 1;
    }

    return 0;
}

int InitializeG(Graph* G){
    int i,j;
    for(i = 0;i<10;i++){
        for(j = 0;j<10;j++)
            G->Edges[i][j] = 0;
        G->Visited[i] = 0;
    }
    G->EdgeN = G->VertexN = 0;

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值