深度优先搜索遍历

来源:互联网 发布:希腊方阵知乎 编辑:程序博客网 时间:2024/05/07 09:32

 问题:

把一个文件中的数据,读取到一个二维数组中,这个文件中的数据如下:
 1 2
 1 3
 1 4
 4 5
说明这是一个无向图,顶点1连接顶点2,顶点1连接顶点3…
将这些数据以无向图邻接矩阵的形式读取并存储,并用深度优先搜索遍历所有顶点并输出。(从给出的数据的第一行的第一各顶点开始进行遍历)

 

源程序:

 

#include<iostream>
#include<fstream>
#include<list>
using namespace std;
list<int>lst;
list<int>::iterator p=lst.begin();
ifstream stream("input.txt");
#define MAX_VERTEX_NUM 20 /* 最大顶点个数 */
struct arc
{
   int adj; /* 顶点关系类型。对无权图,用1(是)或0(否)表示相邻否; */
        };
struct MGraph
{
   int vexs[MAX_VERTEX_NUM]; /* 顶点向量 */
   arc arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];; /* 邻接矩阵 */
   int vexnum,arcnum; /* 图的当前顶点数和弧数 */
  
};
bool visited[MAX_VERTEX_NUM]; /* 访问标志数组(全局量) */
void dfs (MGraph &G,int i)                                                     // 从顶点i 出发遍历
{   int j;                                                          
                   //输出访问顶点
    visited[i]=1;               //全局数组访问标记置1表示已经访问
    cout<<G.vexs[i]<<endl;
 for(j=1; j<=G.vexnum; j++)
    {    if ((G.arcs[i][j].adj==1)&&(!visited[j])){ dfs(G,j); } 
 }
}
void CreateAG(MGraph &G)
{ /* 采用数组(邻接矩阵)表示法,由文件构造没有相关信息的无向图G */
   int i,j;
   G.arcnum=0;
   G.vexnum=0;
   stream.open("input.txt");
   while(!stream.eof())
   {
    stream>>i>>j;
       G.arcs[i][j].adj=G.arcs[j][i].adj=1; /* 无向图 */
       G.arcnum++;
    lst.push_back(i);
       lst.push_back(j);
   }
   stream.close();
   lst.sort();
   lst.unique();
   G.vexnum=lst.size();
   list<int>::iterator p=lst.begin();
   for(int m=1;m<=lst.size();m++)
   {
      G.vexs[m]=*p;
   p++;
   }
  
  
}

void main()
{   int firstver;
   
    stream>>firstver;
 stream.close();
 MGraph G;
 CreateAG(G);
    dfs(G,firstver);
}

 

原创粉丝点击