深度优先搜索
#include<cmath>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cstdio>
#include<iostream>
using namespace std;
#define MaxValue 65535
#define SIZE 20
typedef struct
{
char Vertex[SIZE];
int IsTrave[SIZE];
int EdgeNum;
int VertexNum;
int arcs[SIZE][SIZE];
}GraphMatrix;
GraphMatrix *CreateGraph( )
{
GraphMatrix *GM;
char start,end;
int weight;
int head,tail;
if((GM=(GraphMatrix *)malloc(sizeof(GraphMatrix)))==NULL)
{
cout<<"内存分配失败"<<endl;
exit(1);
}
cout<<"请输入有多少个顶点和边长"<<endl;
cin>>GM->VertexNum>>GM->EdgeNum;
for(int i=0;i<GM->VertexNum;i++)
{
for(int j=0;j<GM->VertexNum;j++)
GM->arcs[i][j]=MaxValue;
}
for(int i=0;i<GM->VertexNum;i++)
{
GM->IsTrave[i]=0;//为被遍历
}
cout<<"请输入各顶点的信息"<<endl;
for(int i=0;i<GM->VertexNum;i++)
{
cin>>GM->Vertex[i];
}
cout<<"请输入各边的顶点和权值"<<endl;
for(int i=0;i<GM->EdgeNum;i++)
{
cin>>start>>end>>weight;
for(head=0;start!=GM->Vertex[head];head++);
for(tail=0;end!=GM->Vertex[tail];tail++);
GM->arcs[head][tail]=weight;
}
return GM;
}
void DeepTraOne(GraphMatrix *GM,int n)//使用系统的递归代替栈的作用
{
int i;
GM->IsTrave[n]=1;
printf("->%c",GM->Vertex[n]);
for(i=0;i<GM->VertexNum;i++)
{
if((GM->arcs[n][i]!=MaxValue) && (GM->IsTrave[i]==0))//有边且没被访问过
{
DeepTraOne(GM,i);
}
}
return;
}
void DeepTraGraph(GraphMatrix *GM)
{
printf("深度优先遍历结点\n");
for(int i=0;i<GM->VertexNum;i++)
{
if(GM->IsTrave[i]==0)
{
DeepTraOne(GM,i);
}
}
printf("\n");
}
int main()
{
GraphMatrix *GM;
GM=CreateGraph();
DeepTraGraph(GM);
return 0;
}
广度优先搜索
#include<cmath>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cstdio>
#include<iostream>
using namespace std;
#define MaxValue 65535
#define SIZE 20
typedef struct Data
{
int info;
}DATA;
typedef struct queue
{
DATA queues[SIZE];
int rear;//队尾
int front;//队头
}Queue;
typedef struct
{
char Vertex[SIZE];//顶点信息
int IsTrave[SIZE];//点是否被遍历
int EdgeNum;//边数
int VertexNum;//顶点数
int arcs[SIZE][SIZE];//权值
}GraphMatrix;
Queue* InitQueue()//初始化队列
{
Queue* p;
if ((p = (Queue*)malloc(sizeof(Queue))) == NULL)
{
cout << "分配内存失败" << endl;
exit(1);
}
p->rear = 0;
p->front = 0;
return p;
}
void InQueue(Queue* p, int information)//入队(我们要考虑的是否队列已满)
{
if (p->rear == SIZE)
{
cout << "队列已满" << endl;
}
else
{
p->queues[p->rear++].info = information;//希望各位客官能够明白(理解)p->rear++的作用
//改代码先执行p->queues[p->rear]=information 然后执行p->rear加1
}
}
int OutQueue(Queue* p)//出队(我们要考虑的是否队列为空)
{
if (p->rear == p->front)
{
cout << "队列为空" << endl;
}
else
{
return p->queues[p->front++].info;
}
}
GraphMatrix* CreateGraph() //构造图(邻接矩阵)
{
char end, start;
int head, tail;
int weight;
GraphMatrix* GM;
if ((GM = (GraphMatrix*)malloc(sizeof(GraphMatrix))) == NULL)
{
cout << "内存分配失败" << endl;
exit(1);
}
printf("请输入有多少个顶点和边数\n");
cin >> GM->VertexNum >> GM->EdgeNum;
for (int i = 0; i < GM->VertexNum; i++)
{
GM->IsTrave[i] = 0;
for (int j = 0; j < GM->VertexNum; j++)
{
GM->arcs[i][j] = MaxValue;
}
}
printf("请输入各个顶点的信息\n");
for (int i = 0; i < GM->VertexNum; i++)
{
cin >> GM->Vertex[i];
}
printf("请输入各边的顶点和权值\n");
for (int k = 0; k < GM->EdgeNum; k++)
{
cin >> start >> end >> weight;
for (head = 0; start != GM->Vertex[head]; head++);
for (tail = 0; end != GM->Vertex[tail]; tail++);
GM->arcs[head][tail] = weight;
}
return GM;
}
void BFSOne(GraphMatrix* GM, Queue* p, int n)
{
int start;
InQueue(p, n);//广度优先搜索需要的时队列 先入队
GM->IsTrave[n] = 1;
while (p->front != p->rear)
{
start = OutQueue(p);
cout << GM->Vertex[start] << " ";
for (int i = 0; i < GM->VertexNum; i++)
{
if (GM->arcs[start][i] != MaxValue && GM->IsTrave[i] == 0)//有边且没被访问
{
InQueue(p, i);//这些点被访问 储存起来
GM->IsTrave[i] = 1;
}
}
cout<<endl;
}
}
void BFSTraGraph(GraphMatrix *GM,Queue *p)//防止它不是连通图
{
int i;
cout<<"广度优先遍历结点"<<endl;
for(int i=0;i<GM->VertexNum;i++)
{
if(GM->IsTrave[i]==0)
{
BFSOne(GM,p,i);
}
}
}
int main()
{
Queue* p;
GraphMatrix* GM;
GM =CreateGraph();
p=InitQueue();
BFSTraGraph(GM,p);
return 0;
}