图的遍历

深度优先遍历

#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;
}
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值