1416:
按邻接矩阵的方法创建图,分别用深度优先和广度优先方法遍历图。
Input
输入的数据有多组
对于每组测试数据第一行为图中点的个数n(0 < n < 100)与边的数量m(m > =0)。
接下来有m行,每行两个整数a,b(0 <=a,b < n),代表这a,b这两个点之间是连通的。
对于每组测试数据第一行为图中点的个数n(0 < n < 100)与边的数量m(m > =0)。
接下来有m行,每行两个整数a,b(0 <=a,b < n),代表这a,b这两个点之间是连通的。
Output
分别输出按照深度优先搜索与广度优先搜索方法遍历的结果,每个输出结果后面都有一空行。
Sample Input
3 0 5 3 0 1 0 4 1 3
Sample Output
0 1 2 0 1 2 0 1 3 4 2 0 1 4 3 2
这道题实际上就是图的遍历。
但是要注意是从0开始的。
#include<stdio.h>
#include<string.h>
int n,sum,book[101],e[101][101];
void dfs(int cur){
int i;
printf("%d ",cur);
sum++;
if(sum==n-1) return;
for(i=0;i<n;i++){
if(book[i]==0&&e[cur][i]==1){
book[i]=1;
dfs(i);
}
}
}
int main(){
int m,a,b,i,j;
while(scanf("%d%d",&n,&m)!=EOF){
//初始化表;
for(i=0;i<n;i++)
for(j=0;j<m;j++){
if(i==j) e[i][j]=0;
else e[i][j]=9;
}
for(i=0;i<m;i++){
scanf("%d%d",&a,&b);
e[a][b]=1;
e[b][a]=1;
}
//dfs
book[0]=1;
dfs(0);
for(i=0;i<n;i++){
if(book[i]==0) printf("%d ",i);
}
printf("\n");
//bfs
memset(book,0,sizeof(book));
int head,tail,que[10001]={0};
head=tail=0;
que[tail]=0;
tail++;
book[0]=1;
while(head<tail){
int cur=que[head];
for(i=0;i<n;i++){
if(book[i]==0&&e[cur][i]==1){
book[i]=1;
que[tail]=i;
tail++;
}
if(tail>n) break;
}
head++;
}
for(i=0;i<tail;i++)
printf("%d ",que[i]);
for(i=0;i<n;i++){
if(book[i]==0) printf("%d ",i);
}
printf("\n\n");
}
}
里面包含了dfs和bfs两种方法。