5-6 列出连通集 (25分)

5-6 列出连通集 (25分)

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

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

按照”{ v1v2...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 }

思路
关于BFS(广度优先搜索) DFS(深度优先搜索),你可以在其他博客找到深入详细的介绍。

点击访问 PTA-测验

#include <stdio.h>
#include <stdlib.h>
/*评测结果
时间  结果  得分  题目  编译器 用时(ms)  内存(MB)  用户
2016-02-13 23:26    部分正确    17  5-6 gcc 13  1   569985011
测试点结果
测试点 结果  得分/满分   用时(ms)  内存(MB)
测试点1    答案正确    15/15       1       1
测试点2    答案正确    8/8         13      1
测试点3    答案正确    2/2         1       1
*/
typedef struct LNode *Vertex;
struct LNode {
    int Data;
    int Flag;
    Vertex Next;
};
Vertex CreatV(int);
int InsertV(Vertex,int);
void DFS(Vertex,int,int);
void BFS(Vertex,int,int);
int main() {
    int N,E;
    scanf("%d%d",&N,&E);
    int from,to;
    Vertex V=CreatV(N);
    for(int i=0; i<E; i++) {
        scanf("%d%d",&from,&to);
        InsertV(&V[to],from); 
        InsertV(&V[from],to);
    }
//  for(int i=0; i<N; i++) {
//      printf("%d:",i);
//      Vertex temp=V[i].Next;
//      while(temp) {
//          printf(" %d",temp->Data);
//          temp=temp->Next;
//      }
//      printf("\n");
//  }

    for(int i=0; i<N; i++) {
        if(!V[i].Flag) {
            V[i].Flag=1;
            printf("{");
            printf(" %d",i);
            DFS(V,N,i);
            printf(" }\n");
        }
    }   for(int i=0;i<N;i++)V[i].Flag=0;
    for(int i=0; i<N; i++) {
        if(!V[i].Flag) {
            V[i].Flag=1;
            printf("{");
            printf(" %d",i);
            BFS(V,N,i);
            printf(" }\n");
        }
    }

}
void BFS(Vertex V,int n,int key) {
    int a[10];
    int left=-1,right=0;
    while(left!=right) {
        for(Vertex temp=V[key].Next; temp; temp=temp->Next) {
            int ConFlag=0;
            for(int i=0; i<right%10; i++) {
                if(a[i]==temp->Data) {
                    ConFlag=1;
                    break;
                }
            }
            if(ConFlag)continue;
            a[right++%10]=temp->Data;
            if(!V[temp->Data].Flag)
            printf(" %d",temp->Data);
            V[temp->Data].Flag=1;
        }
        key=a[++left%10];
    }

}
void DFS(Vertex V,int n,int key) {
    if(!V) {
        return ;
    }
    Vertex temp=V[key].Next;
    while(temp) {
        if(!V[temp->Data].Flag) {
            printf(" %d",temp->Data);
            V[temp->Data].Flag=1;
            DFS(V,n,temp->Data);
        }
        temp=temp->Next;
    }
    return ;
}
Vertex CreatV(int num) {
    Vertex V=(Vertex)malloc(sizeof(struct LNode)*num);
    for(int i=0; i<num; i++) {
        V[i].Next=NULL;
        V[i].Flag=0;
    }
    return V;
}
int InsertV(Vertex V,int X) {
    if(!V)return 0;

    while(V->Next&&V->Next->Data<X)V=V->Next;
    Vertex temp=(V->Next)?V->Next:NULL;
    V->Next=(Vertex)malloc(sizeof(struct LNode));
    V->Next->Data=X;
    V->Next->Next=temp;
//  printf("in%d,",V->Next->Data);
    return 1;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值