[数据结构]无向图的各连通分支 解题报告

Problem Description

求解无向图的各连通分支

输入:

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

输出:

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

测试输入

8
0 5
5 2
4 5
5 6
6 2
3 7
0 2
-1

测试输出

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

AcCode

//
//  main.cpp
//  无向图的各连通分支
//
//  Created by jetviper on 2017/3/26.
//  Copyright © 2017年 jetviper. All rights reserved.
//

#include <stdio.h>

int n;
struct{
    int vsd;
    int bnum;
    int linkto[18];
}node[18];

void bfs(int now){
    int count=0,temp[18];
    if(node[now].vsd==0){
        node[now].vsd=1;
        printf("%d",now);
    }
    
    for(int i=0;i<node[now].bnum;i++) {
        for(int j=i;j<node[now].bnum;j++){
            if(node[now].linkto[i]>node[now].linkto[j]){
                int tmp = node[now].linkto[i];
                node[now].linkto[i] = node[now].linkto[j];
                node[now].linkto[j] = tmp;
            }
        }
        
        
        
    }
    
    
    for(int i=0;i<node[now].bnum;i++) {
        
        if(node[node[now].linkto[i]].vsd==0) {
            
            printf("-%d",node[now].linkto[i]);
            
            node[node[now].linkto[i]].vsd = 1;
            
            temp[count]=node[now].linkto[i];
            
            count++;
        }
    }
    
    for(int i=0;i<count;i++) {
        bfs(temp[i]);
    }
    
}

int main() {
    
    int x,y;
    
    scanf("%d",&n);
    
    for(int i=0;i<n;i++){
        node[i].vsd=0;
        node[i].bnum=0;
    }
    
    while(1){
        scanf("%d",&x);
        if(x==-1)break;
        scanf("%d",&y);
        node[x].linkto[node[x].bnum]=y;
        node[x].bnum++;
        node[y].linkto[node[y].bnum]=x;
        node[y].bnum++;
    }
    
    for(int i=0;i<n;i++) {
        if(node[i].vsd==0) {
            bfs(i);
            printf("\n");
        }
    }
    
    return 0;
}
    原文作者:monigo
    原文地址: https://www.jianshu.com/p/1be30a8f6358
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞