您的位置:首页 > 其它

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

2014-09-01 19:20 197 查看
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);
    }
   }
  }
   
   

 }
 



转发至微博
 



转发至微博
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: