搜索的学习和调试,包括深度搜索和…

Description

编写无向图的邻接矩阵类AdjMWGraph,实现无向图的广度遍历和深度遍历。其中,图中顶点数据类型为字符。

Input

第一行图中顶点的个数n(4<=n<=26) 第二行是图中边的条数m(3<=m<=351) 第三行是顶点信息(全为大写字母) 后面的输入数据是依附于一条边的两个顶点,有多少条边,就输入多少组信息。

注意:根结点都为A;并且所给字符连续,也就是说A B C D ……。

Output

广度优先搜索序列。 深度优先搜索序列。

Sample Input


7
6
A B C D E F G
A B
A C
B D
B E
C F
C G

Sample Output


A B C D E F G
A B D E C F G
#include<iostream>
 #include<string.h>
 #include<algorithm>
 #include<deque>

 using namespace std;
 #define MAXNODE 100 //最大顶点数目 
 
 
 void dfs(int G[][MAXNODE],int i,int n);
 void bfs(int G[][MAXNODE],int i,int n);
 

 int a[MAXNODE][MAXNODE];
 struct ns
 {
  int no;//顶点关系类型,对无权图用1或0表示是否相邻;对带权图为权值类型
  char ch;//弧相关信息
 }NODE[MAXNODE];
 bool visi1[MAXNODE]={false};
 bool visi2[MAXNODE]={false};
 int main()
 {

  int n,m,i,j,x1,x2,flag;
  char ch1,ch2;
  cin>>m>>n;
  for(i=0;i<m;i++)
  {
   cin>>NODE[i].ch;
   NODE[i].no=i;//赋值为 
  }
  for(i=0;i<m;i++)
   for(j=0;j<m;j++)
     a[i][j]=0;
  for(i=0;i<n;i++)
  {   
   flag=0;
   x1=-1;
   x2=-1;
   cin>>ch1>>ch2;
   for(j=0;j<m;j++)
   {   
    if(ch1==NODE[j].ch)
        x1=NODE[j].no;
    else if(NODE[j].ch==ch2)
     x2=NODE[j].no;
    if(x1!=-1&&x2!=-1)
    {
     flag=1;
     break;
   
   }
   if(flag==1)
   a[x1][x2]=1; 
 
  }
    bfs(a,0,m);
    cout<<endl;
  dfs(a,0,m);
  cout<<endl;
  while(1);
  return 0; 
 
 }
 //采用递归来进行深度搜索 
 void dfs(int G[][MAXNODE],int i,int n)
 {
  int j;
  cout<<NODE[i].ch<<" ";
  visi1[i]=true;
  for(j=0;j<n;j++)
  {
   if(!visi1[j]&&G[i][j]!=0)
    dfs(G,j,n);
 
 
 //利用队列广度搜索 
 void bfs(int G[][MAXNODE],int i,int n)
 {
  int j,k;
     deque<int> q;
  cout<<NODE[i].ch<<" ";
  visi2[i]=true;
     q.push_back(i);
  while(!q.empty())
  {
      k=q.front();
         q.pop_front();
   for(j=0;j<n;j++)
   {
    if(!visi2[j]&&G[k][j]!=0)
    {
     cout<<NODE[j].ch<<" ";
        visi2[j]=true;
        q.push_back(j);
    }
   }
  }
   
   

 }
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值