//定义全局变量
const int Maxnum=50;
typedef int AdjMatrix[Maxnum][Maxnum];//定义边数组结构
typedef Struct
{
int vexnum,arcnum;//顶点数、边数
AdjMatrix arcs;//边数组
}Graph;//图
bool visited[Maxnum];//标记是否访问的数组
//DFS:时间复杂度O(n*n)
//相当于树遍历中的前序遍历
//适合寻找目标明确,以找到目标为目的的情况
void DFS(Graph &g, int v)
{
visited[v]=true;//从V开始访问,flag它
printf("%d",v);//打印v
for(int j=0;j<g.vex.num;j++)
{
if(arcs[v][j]==1 && visited[j]==false)//这里可以获得V未访问过的邻接点
DFS(g,j);//递归调用,如果所有节点都被访问过,就回溯,而不再调用这里的DFS
}
}
void DFSTraverse(Graph &g)
{
for(int i=0;i<g.vexnum;i++)//初始化访问数组
visited[i]=false;
for(int i=0;i<g.vexnum;i++)
{
if(visited[i]==false)//从没有访问过的第一个元素来遍历图
DFS(g,i);
}
}
//BFS:时间复杂度O(n*n)
//相当于树遍历中的层次遍历
//适合在不断扩大遍历范围时找到相对最优解的情况
void(Graph &g)
{
for(int i=0;i<g.vexnum;i++)//初始化访问数组
visited[i]=false;
queue<int> Q;
for(int i=0;i<g.vexnum;i++)
{
if(visited[i]==false)//若该点没有访问
{
visited[i]=true;//标记该点
Q.push(i);//将该点加入队列
while(!Q.empty())//只要队列不空,遍历就没有结束
{
int t=Q.front();//取出队头元素
printf("%d",t);//打印t
Q.pop();
for(int j=0;j<g.vexnum;j++)
{
if(arcs[t][j]==1 && visited[j]==false)//将其未访问过的邻接点加进入队列
{
visited[j]==true;//在这里要设置true,因为这里该顶点我们已经加入到了队列,为了防止重复加入!
Q.push(j);
}
}
}
}
}
}