#include<iostream>
#include<queue>
using namespace std;
#define VERTEX_MAX 20
bool visted[VERTEX_MAX];
typedef struct node {
int adjvex; //顶点的位置
struct node * next; //指向下一条边的指针
}EdgeNode;
typedef struct vnode {
char vertex;
EdgeNode *firstedge;
}AdjList[VERTEX_MAX];
typedef struct {
AdjList vertexs; //邻接表
int verNum, edgeNum; //图中顶点和边的数量
}Graph;
/*****************************************************
*
* 建立图的邻接表
*
******************************************************/
void CreateGraph(Graph *G) {
int v1, v2, i, j, k;
cout<<"请输入图的顶点数n和边数e:"<<endl;
cin>>G->verNum>>G->edgeNum;
cout<<"请输入每个顶点的编号"<<endl;
for( i = 0; i < G->verNum; i++)
{
cin>>G->vertexs[i].vertex;
G->vertexs[i].firstedge = NULL;
}
cout<<"请输入每条边对应的顶点:"<<endl;
EdgeNode *p;
for(k = 0; k < G->edgeNum; k++)
{
cin>>i>>j;
p = new node;
p->adjvex = j - 1;
p->next = G->vertexs[i - 1].firstedge;
G->vertexs[i - 1].firstedge = p;
}
}
/****************************************************
*
* 深搜
*
*****************************************************/
void DFSTraverse(Graph *G, int v)
{
visted[v] = true;
cout<<G->vertexs[v].vertex<<"->";
EdgeNode *p = G->vertexs[v].firstedge;
while( p != NULL)
{
if(!visted[p->adjvex])
{
DFSTraverse(G, p->adjvex);
}
p = p->next;
}
}
void DFS(Graph *G)
{
for(int i = 0; i < G->verNum; i++)
{
visted[i] = false;
}
cout<<"深搜:";
for(int i = 0; i < G->verNum; i++)
{
if(!visted[i])
{
DFSTraverse(G, i);
}
}
cout<<"null\n";
}
/**************************************************
*
* 广搜
*
**************************************************/
void BFS(Graph *G)
{
queue<int > q;
EdgeNode *p;
for(int i = 0; i < G->verNum; i++)
{
visted[i] = false;
}
cout<<"广搜: ";
for(int i = 0; i < G->verNum; i++)
{
if(!visted[i])
{
visted[i] = true;
cout<<G->vertexs[i].vertex<<"->";
q.push(i);
while(!q.empty())
{
int j = q.front();
q.pop();
p = G->vertexs[j].firstedge;
while(p)
{
if(!visted[p->adjvex])
{
cout<<G->vertexs[p->adjvex].vertex<<"->";
visted[p->adjvex] = true;
q.push(p->adjvex);
}
p = p->next;
}
}
}
}
cout<<"null\n";
}
int main()
{
Graph *G = new Graph;
CreateGraph(G);
DFS(G);
BFS(G);
return 0;
}