图的广度优先
#include<stdio.h>
#include<iostream>
using namespace std;
int main(){
int i,j,n,m,a,b,cur,book[101]={0},e[101][101];
int que[10001],head,tail;
cin>>n>>m;
//初始化二维数组
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(i==j) e[i][j]=0;
else e[i][j]=9999999;
//读入顶点之间的边
for(int i=1;i<=m;i++){
cin>>a>>b;
e[a][b]=1;
e[b][a]=1;//由于是无向图
}
head = 1; tail = 1;//队列的初始化
que[tail]=1;
tail++;
book[1]=1;//标记1号点已经访问了
while(head<tail&&tail<n){//队列不为空
cur=que[head];//当前访问的顶点
for(i=1;i<=n;i++){
if(e[cur][i]==1&&book[i]==0){//如果没有访问,则入队
que[tail]=i;
tail++;
book[i]=1;//标记已经访问
}
if(tail>n){
break;
}
}
head++;//一层层的遍历
}
for(int i=1;i<tail;i++){
cout<<que[i]<<" ";
}
}
图的深度优先
#include<cstdio>
#include<iostream>
using namespace std;
int book[101],sum,n,e[101][101];
void dfs(int cur){
int i;
cout<<cur<<" ";
sum++;
if(sum==n) return;//如果所有的都遍历完了,则完全退出
for(int i=1;i<=n;i++){
if(e[cur][i]==1&&book[i]==0){//如果该点没有访问,则标记它,继续深入
book[i]=1;
dfs(i);
}
}
return;
}
int main(){
int i,j,m,a,b;
cin>>n>>m;
//初始化二维矩阵
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(i==j) e[i][j]=0;
else e[i][j]=99999;
//读入顶点之间的边
for(int i=1;i<=m;i++){
cin>>a>>b;
e[a][b]=1;
e[b][a]=1;
}
book[1]=1;
dfs(1);
}