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;
}