图的遍历一般用两种遍历方法:
1>邻接矩阵遍历(我认为是暴力遍历,要列举每两个点之间是否有边)
2>邻接表遍历(运用了链表的思想,只要有边就存)
显然,后者相比前者更节省空间,但脑回路也要更复杂点
邻接链表遍历
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
struct node{
int v,w,next;
}a[2005];
bool f[105];
int first[105]; //first[i]表示以i作为起点的第一条边所在的位置
int n,m,u1,v1,w1,k=0;
queue<int> q;
void add(int u1,int v1,int w1){
++k;
a[k].v=v1;a[k].w=w1;a[k].next=first[u1];first[u1]=k;
}
void dfs(int x){ //从x点开始深搜
printf("%d ",x);
for(int i=first[x];i;i=a[i].next){
int j=a[i].v;
if(f[j]){
f[j]=0;
dfs(j);
}
}
}
void bfs(){ //从x点开始广搜
int x=q.front(); q.pop();
printf("%d ",x);
for(int i=first[x];i;i=a[i].next){
int j=a[i].v;
if(f[j]){
f[j]=0;
q.push(j);
}
}
while(!q.empty())
bfs();
}
int main(){
scanf("%d%d",&n,&m);
memset(first,0,sizeof(first));
memset(f,1,sizeof(f));
for(int i=1;i<=m;++i){
scanf("%d%d%d",&u1,&v1,&w1);
add(u1,v1,w1);
add(v1,u1,w1);
}
//f[1]=0; dfs(1);
f[1]=0;q.push(1);
bfs();
return 0;
}
邻接矩阵遍历
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
struct node{
int v,w,next;
}a[2005];
bool f[105];
int first[105]; //first[i]表示以i作为起点的第一条边所在的位置
int n,m,u1,v1,w1,k=0;
queue<int> q;
void add(int u1,int v1,int w1){
++k;
a[k].v=v1;a[k].w=w1;a[k].next=first[u1];first[u1]=k;
}
void dfs(int x){ //从x点开始深搜
printf("%d ",x);
for(int i=first[x];i;i=a[i].next){
int j=a[i].v;
if(f[j]){
f[j]=0;
dfs(j);
}
}
}
void bfs(){ //从x点开始广搜
int x=q.front(); q.pop();
printf("%d ",x);
for(int i=first[x];i;i=a[i].next){
int j=a[i].v;
if(f[j]){
f[j]=0;
q.push(j);
}
}
while(!q.empty())
bfs();
}
int main(){
scanf("%d%d",&n,&m);
memset(first,0,sizeof(first));
memset(f,1,sizeof(f));
for(int i=1;i<=m;++i){
scanf("%d%d%d",&u1,&v1,&w1);
add(u1,v1,w1);
add(v1,u1,w1);
}
//f[1]=0; dfs(1);
f[1]=0;q.push(1);
bfs();
return 0;
}
以下代码我也不知道拿来干嘛的,但就一起发了吧
#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
struct node{
int v,next;
}a[2005];
int vi,ui,n,f[1005],m,first[2000];
void add(int vi,int ui,int wi)
{
k++;
a[k].v=vi;a[k].next=first[ui];first[ui]=k;
}
void dfs(int x)
{
printf("%d",a[x].v);
for(int i=first[x];i;i=a[i].nest)
{
int j=a[i].v;
if(f[j])
{
f[j]=0;
dfs(j);
}
}
}
int main()
{
scanf("%d%d",&n,&m);
memset(f,0,sizeof(f));
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&vi,&ui,&wi);
add(vi,ui,wi);
}
f[1]=0;
dfs(1)
return 0;
}