dfs
void dfs(char s[],int arc[][35],int v[],int n,int x){
//顶点字符串、边、已经遍历过的顶点、顶点个数、当前遍历的顶点的下标
v[x]=1;
for(int i=0;i<n;i++){
if(arc[x][i]&&!v[i]){//顶点i与顶点x有边且i尚未遍历
dfs(s,arc,v,n,i);//遍历顶点x的每一个邻接点
}
}
}
bfs
void bfs(char s[],int arc[][35],int v[],int n,int x){//对顶点x广度优先遍历
int front=-1,rear=-1;
int q[100];//存下标!!
q[++rear]=x;//a[x]入队
v[x]=1;
while(front!=rear){
front++;
for(int i=0;i<n;i++){//存入front的邻接点(出队的那个顶点的邻接点)
if(!v[i]&&arc[q[front]][i]){//不是front,是q[front]:下标!!
//顶点i尚未入队且i与顶点q[front]有边
q[++rear]=i;//i入队
v[i]=1;//标记i已入队
}
}
}
}
实例
广度优先生成树
Time Limit: 1000/2000 MS (C/Others) Memory Limit: 32768/32768 K (C/Others)
Problem Description:
设有一连通无向图,其顶点值为字符型并假设各值互不相等,采用邻接矩阵表示法存储表示。利用BFS算法求其广度优先生成树(从下标0的顶点开始遍历),并在遍历过程中输出广度优先生成树的每一条边。
Input:
有多组测试数据,每组数据的第一行为两个整数n和e,表示n个顶点和e条边(0<n<20);第二行为其n个顶点的值,按输入顺序进行存储;后面有e行,表示e条边的信息,每条边信息占一行,包括边所依附的顶点下标i和j,数据之间用空格隔开。
Output:
输出广度优先生成树的每一条边,每条边信息之后均有一空格,每组输出占一行,具体格式见样例。
Sample Input:
4 4
ABCD
0 1
0 3
1 2
1 3
Sample Output:
(A,B) (A,D) (B,C)
Hint:
Source:
代码
#include<iostream>
using namespace std;
void dfs(char a[],int arc[][35],int s[],int n,int x){
cout<<a[x];
s[x]=1;
for(int i=0;i<n;i++){
if(arc[x][i]&&s[i]==0){
arc[x][i]=arc[i][x]=0;
dfs(a,arc,s,n,i);
}
}
}
void bfs(char a[],int arc[][35],int s[],int n,int x){
int front=-1,rear=-1;
int q[100];//存下标
q[++rear]=x;//a[x]入队
s[x]=1;
while(front!=rear){
cout<<a[q[++front]];
for(int i=0;i<n;i++){//存入front的邻接点(出队的那个的邻接点)
// cout<<"arc["<<q[front]<<"]["<<i<<"]:"<<arc[front][i]<<endl;
if(!s[i]&&arc[q[front]][i]){
// cout<<"i:"<<i<<endl;
q[++rear]=i;
s[i]=1;
}
}
}
}
int main(){
int n,e;
while(cin>>n>>e){
char s[30];
int arc[35][35]={0};
cin>>s;
int a,b;
while(e--){
cin>>a>>b;
arc[a][b]=arc[b][a]=1;
}
int ss[30]={0};
dfs(s,arc,ss,n,0);
cout<<endl;
}
return 0;
}