深度优先遍历
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<map>
#include<queue>
#include <deque>
#include <list>
#include <ctime>
#include <stack>
#include <vector>
#include<set>
#define Maxn 1024
#define MOD
typedef long long ll;
#define FOR(i,j,n) for(int i=j;i<=n;i++)
#define DFR(i,j,k) for(int i=j;i>=k;--i)
#define lowbit(a) a&-a
#define Max(a,b) a>b?a:b
#define Min(a,b) a>b?b:a
const int inf = 0x3f3f3f3f;
const double pi = acos(-1.0);
using namespace std;
int book[Maxn],sum,n,e[Maxn][Maxn];
void DFS(int cur)
{ int i;
printf("%d ",cur);
sum++;
if(sum==n) return;
FOR(i,1,n)
{
if(e[cur][i]==1&&book[i]==0) book[i]=1,DFS(i);
}
return ;
}
int main()
{ int i,j,a,b,m;
scanf("%d%d",&n,&m);
FOR(i,1,n)
FOR(j,1,n)
if(i==j)e[i][j]=0;
else e[i][j]=inf;
FOR(i,1,m)
{
scanf("%d%d",&a,&b);
e[a][b]=1;
e[b][a]=1;//无向图
}
book[1]=1;
DFS(1);
return 0;
}
使用前向星优化之后复杂度可以到O(m)
int head[n];
bool s[Maxn]={0};
struct EdgeNode
{ int to;
int w;
int next;
}Edges[m];
//读入
cin>>i>>j>>k;
Edges[k].to=j;//k表示当前输入第k条边
Edges[k].w=w;
Edges[k].next=head[i];
head[i]=k;
//
void DFS(int x)
{ s[x]=true;
printf("%d\n");
int i;
for(i=head[x];i!=-1;i=edge[i].next)
if(!s[edge[i].to]) DFS(edge[i].to);
}
广度优先遍历
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<map>
#include<queue>
#include <deque>
#include <list>
#include <ctime>
#include <stack>
#include <vector>
#include<set>
#define Maxn 1024
#define MOD
typedef long long ll;
#define FOR(i,j,n) for(int i=j;i<=n;i++)
#define DFR(i,j,k) for(int i=j;i>=k;--i)
#define lowbit(a) a&-a
#define Max(a,b) a>b?a:b
#define Min(a,b) a>b?b:a
const int inf = 0x3f3f3f3f;
const double pi = acos(-1.0);
int book[Maxn],sum,n,e[Maxn][Maxn],que[Maxn*Maxn];
int main()
{ int i,j,a,b,m,cur;
int head,tail;
scanf("%d%d",&n,&m);
FOR(i,1,n)
FOR(j,1,n)
if(!(i^j))e[i][j]=0;
else e[i][j]=inf;
FOR(i,1,m)
{
scanf("%d%d",&a,&b);
e[a][b]=1;
e[b][a]=1;//无向图
}
head=1;
tail=1;
que[tail]=1;
tail++;
book[1]=1;
while(head<tail)
{cur=que[head];
FOR(i,1,n)
{if(e[cur][i]==1&&book[i]==0)
{
que[tail]=i;
tail++;
book[i]=1;
}
if(tail>n)break;
}
head++;
}
FOR(i,1,tail-1)
printf("%d ",que[i]);
return 0;
}
也可以用前向星优化
int head[n];
bool s[Maxn]={0};
struct EdgeNode
{ int to;
int w;
int next;
}Edges[m];
//读入
cin>>i>>j>>k;
Edges[k].to=j;//k表示当前输入第k条边
Edges[k].w=w;
Edges[k].next=head[i];
head[i]=k;
//
void BFS(int x)
{ int queue[Maxn];
int iq=0;
queue[iq++]=x;
int i,k;
for(i=0;;i<iq;i++)
{ printf("%d\n",queue[i]);
for(k=head[queue[i]];k!=-1;k=edge[k].next) if(!s[edge[k].to])queue[iq++]=edge[k].to;
}
}