求解无向图的各连通分支
输入:
第一行为图的节点数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;
}