求解无向图的各连通分支

求解无向图的各连通分支

输入:

第一行为图的节点数n(节点编号0至n-1,0<n<=10)
从第二行开始列出图的边,-1表示输入结束

输出:
输出每个连通分支的广度优先搜索序列(从连通分支的最小编号开始),不同分支以最小编号递增顺序列出

sample:
input:
8
0 5
5 2
4 5
5 6
6 2
3 7
-1

output:
0-5-2-4-6
1
3-7

#include<stdio.h>  
#include<stdlib.h>  
#define MAX 11  
int record[MAX]={0};  
  
int comp(const void *a,const void *b)  
{  
    return *(int*)a-*(int*)b;  
}  
typedef struct{  
    int id;  
    int num_of_link;  
    int linkto[MAX];  
}node;  
  
node dot[MAX];  
  
void bfs(int pt)  
{  
    int flag=1; //判断是否结束遍历   
    int num=0;  
    qsort(dot[pt].linkto,dot[pt].num_of_link,sizeof(int),comp);  
    for(int i=0;i<dot[pt].num_of_link;++i)  
    {  
        if(dot[dot[pt].linkto[i]].id==0)  
        {  
            flag=0;   
            printf("-%d",dot[pt].linkto[i]);  
            dot[dot[pt].linkto[i]].id=1;  
            record[num]=dot[pt].linkto[i];  
            ++num;  
        }  
    }  
    if(flag) return;  
    for(int i=0;i<num;++i)  
    {  
        bfs(record[i]);     //遍历pt的邻接点   
    }  
    return;  
}  
  
int main()  
{  
    int n;  
    scanf("%d",&n);  
    for(int i=0;i<n;++i)  
    {  
        dot[i].id=0;  
        dot[i].num_of_link=0;  
    }  
    int f,t;  
    while(1)  //储存边   
    {  
        scanf("%d",&f);  
        if(f==-1) break;  
        scanf("%d",&t);  
        dot[f].linkto[dot[f].num_of_link]=t;  
        ++dot[f].num_of_link;  
        dot[t].linkto[dot[t].num_of_link]=f;  
        ++dot[t].num_of_link;  
    }  
    for(int i=0;i<n;++i)  
    {  
        if(dot[i].id==0)  
        {  
            dot[i].id=1;  
            printf("%d",i);  
            bfs(i);  
            printf("\n");  
        }  
    }  
    return 0;  
}  

 

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值