定义
并非练成一个圈才叫连通分量,只要顶点之间有边,就叫连通分量;
A-B-C是连通图,A-B-C-A也是;
实例
求连通分量
Time Limit: 1000/2000 MS (C/Others) Memory Limit: 32768/32768 K (C/Others)
Problem Description:
设有一无向图,其顶点值为字符型并假设各值互不相等,采用邻接矩阵表示法存储表示。利用BFS算法求其各连通分量,并按广度优先遍历的顺序输出各连通分量中的顶点(若该无向图为连通图,则做为一个连通分量)。
Input:
有多组测试数据,每组数据的第一行为两个整数n和e,表示n个顶点和e条边(1<n<20);第二行为其n个顶点的值,按输入顺序进行存储;后面有e行,表示e条边的信息,每条边信息占一行,包括边所依附的顶点下标i和j,数据之间用空格隔开。
Output:
每组输出数据占若干行,每行输出一个连通分量中的顶点(若该无向图为连通图,则做为一个连通分量),要求按广度优先遍历的顺序输出各顶点,每两组输出数据之间有一空行,具体格式见样例。
Sample Input:
4 4
ABCD
0 1
0 3
1 2
1 3
4 3
ABCD
0 1
0 3
1 3
Sample Output:
1:A,B,D,C
1:A,B,D
2:C
Hint:
Source:
代码
#include<iostream>
using namespace std;
int v[25];
void bfs(int arc[][25],char s[],int n,int k){
int rear=-1,front=-1,q[25];
q[++rear]=k;
v[k]=1;
while(front!=rear){
if(front>=0)
cout<<",";
cout<<s[q[++front]];
for(int i=0;i<n;i++){
if(arc[q[front]][i]&&!v[i]){
q[++rear]=i;
v[i]=1;
}
}
}
cout<<endl;
}
int main(){
int n,e;
char s[25];
int f=0;
while(cin>>n>>e){
for(int i=0;i<n;i++)
v[i]=0;
cin>>s;
int a,b,arc[25][25]={0};
for(int i=0;i<e;i++){
cin>>a>>b;
arc[a][b]=arc[b][a]=1;
}
if(f)
cout<<endl;
int c=1;
for(int i=0;i<n;i++){
if(!v[i]){
// cout<<"i:"<<i<<endl;
cout<<c++<<":";
bfs(arc,s,n,i);
}
}
f++;
}
return 0;
}