#include <iostream>
#include <string>
#include <queue>
using namespace std;
//表结点
typedef struct ArcNode{
int adjvex;//该弧所指向的顶点的位置
ArcNode *nextarc;//指向下一条弧的指针
}ArcNode;
//头结点
typedef struct VNode{
string data;//顶点信息
ArcNode* firstarc;//第一个表结点的地址,指向第一条依附该顶点的弧的指针
}VNode, AdjList[10];
typedef struct{
AdjList vertices;
int vexnum, arcnum;//图的顶点数和弧数
}ALGraph;
int LocateVex(ALGraph G, string u)//返回顶点u在图中的位置
{
for(int i=0; i<G.vexnum; i++)
if(G.vertices[i].data==u)
return i;
return -1;
}
void CreateUDG(ALGraph &G)//构造无向图
{
string v1, v2;
int i, j, k;
cout<<"请输入顶点数和边数:";
cin>>G.vexnum>>G.arcnum;
cout<<"请输入顶点:";
for(i=0; i<G.vexnum; i++)
{
cin>>G.vertices[i].data;
G.vertices[i].firstarc=NULL;
}
cout<<"请输入边:";
cout<<endl;
for(k=0; k<G.arcnum; k++)
{
cin>>v1>>v2;
i=LocateVex(G, v1);
j=LocateVex(G, v2);
//插入v1的邻接表,为了提高效率,总在表头插入结点。
ArcNode *arc=new ArcNode;
arc->adjvex=j;
arc->nextarc=G.vertices[i].firstarc;
G.vertices[i].firstarc=arc;
//插入v2的邻接表,为了提高效率,总在表头插入结点。
arc=new ArcNode;
arc->adjvex=i;
arc->nextarc=G.vertices[j].firstarc;
G.vertices[j].firstarc=arc;
}
}
void Print(ALGraph G)//打印邻接表
{
cout<<"打印邻接表如下:";
cout<<endl;
for(int i=0; i<G.vexnum; i++)//遍历每个顶点的邻接表
{
cout<<G.vertices[i].data;
ArcNode *p=G.vertices[i].firstarc;
while(p)
{
cout<<"->"<<G.vertices[p->adjvex].data;
p=p->nextarc;
}
cout<<endl;
}
}
int FirstAdjVex(ALGraph G, int v)//返回顶点v的第一个邻接点序号
{
ArcNode *p=G.vertices[v].firstarc;
if(p)
return p->adjvex;
else
return -1;
}
int NextAdjVex(ALGraph G, int v, int w)//返回顶点v的相对于w的下一个邻接点序号
{
ArcNode* p=G.vertices[v].firstarc;
while(p)
{
if(p->adjvex==w)
break;
p=p->nextarc;
}
if(p->adjvex!=w || !p->nextarc)//如果没找到w或者w是最后一个邻接点
return -1;
return p->nextarc->adjvex;
}
bool visited[10];
void DFS(ALGraph G, int v)
{
visited[v]=true;
cout<<G.vertices[v].data<<" ";
for(int w=FirstAdjVex(G, v); w>=0; w=NextAdjVex(G, v, w) )
if(!visited[w])
DFS(G, w);
}
void DFSTraverse(ALGraph G)//深搜
{
for(int i=0; i<G.vexnum; i++)
visited[i]=false;
for(i=0; i<G.vexnum; i++)
if(!visited[i])
DFS(G, i);
}
void BFSTraverse(ALGraph G)//广搜
{
queue<int> q;
for(int i=0; i<G.vexnum; i++)
visited[i]=false;
for(i=0; i<G.vexnum; i++)
{
if(!visited[i])
{
q.push(i);
visited[i]=true;
while(!q.empty())
{
int v=q.front();
q.pop();
cout<<G.vertices[v].data<<" ";
for(int w=FirstAdjVex(G, v); w>=0; w=NextAdjVex(G, v, w))
{
if (!visited[w])
{
q.push(w);
visited[w]=true;
}
}
}
}
}
}
void main()
{
ALGraph G;
CreateUDG(G);
Print(G);
cout<<"深搜:";
DFSTraverse(G);
cout<<endl;
cout<<"广搜:";
BFSTraverse(G);
cout<<endl;
}