#include<stdio.h>
#include<iostream>
using namespace std;
#define MaxInt 32767
#define MVNum 100
#define OK 1
#define MAXQSIZE 100
typedef char VerTexType;
typedef int ArcType;
typedef struct
{
VerTexType vexs[MVNum];
ArcType arcs[MVNum][MVNum];
int vexnum,arcnum;
}AMGraph;
AMGraph G;
typedef struct
{
int *base;
int front,rear;
}SqQueue;
int InitQueue(SqQueue &Q)
{
Q.base=new int[MAXQSIZE];
if(!Q.base) exit(0);
Q.front=Q.rear=0;
return OK;
}
int EnQueue(SqQueue &Q,int e)
{
if((Q.rear+1)%MAXQSIZE==Q.front)
return 0;
Q.base[Q.rear]=e;
Q.rear=(Q.rear+1)%MAXQSIZE;
return OK;
}
int DeQueue(SqQueue &Q,int &e)
{
if(Q.front==Q.rear) return 0;
e=Q.base[Q.front];
Q.front=(Q.front+1)%MAXQSIZE;
return OK;
}
int QueueEmpty(SqQueue &Q)
{
if (Q.front==Q.rear) return OK;
else return 0;
}
int LocateVex(AMGraph G,int b)
{
int a;
for(a=0;a<G.vexnum;a++)
{
if(G.vexs[a]==b)
return a;
}
}
int CreateUDN(AMGraph &G)
{
cout<<"请输入顶点的个数:\n";
cin>>G.vexnum;
cout<<"请输入边的条数:\n";
cin>>G.arcnum;
int i,j,k,v1,v2,w;
cout<<"依次输入顶点的信息:\n";
for(i=0;i<G.vexnum;i++)
cin>>G.vexs[i];
for(i=0;i<G.vexnum;i++)
for(j=0;j<G.vexnum;j++)
G.arcs[i][j]=0;
for(k=0;k<G.arcnum;k++)
{
cout<<"输入一条边依附的顶点: ";
cin>>v1>>v2;
G.arcs[v1][v2]=1;
G.arcs[v2][v1]=1;
}
return OK;
}
bool visited[MVNum];
void DFS_AM(AMGraph G,int v)
{
cout<<v;
int w;
visited[v]=1;
for(w=1;w<=G.vexnum;w++)
if((G.arcs[v][w]!=0)&&(!visited[w]))
DFS_AM(G,w);
}
void DFSTraverse(AMGraph G)
{
int v;
for(v=0;v<G.vexnum;++v)
visited[v]=0;
for(v=1;v<=G.vexnum;++v)
if(!visited[v])
DFS_AM(G,v);
}
void BFS(AMGraph G,int v)
{
cout<<v;
int u,w;
SqQueue Q;
visited[v]=1;
InitQueue(Q);
EnQueue(Q,v);
while(!QueueEmpty(Q))
{
DeQueue(Q,u);
for(w=1;w<=G.vexnum;w++)
if((G.arcs[u][w]!=0)&&(!visited[w]))
{
cout<<w;
visited[w]=1;
EnQueue(Q,w);
}
}
}
int main()
{
CreateUDN(G);
int choose,v;
while(1)
{
cout<<"请输入功能0(DFS)或1(BFS):\n";
cin>>choose;
if(choose==0)
{
DFS_AM(G,1);
break;
}
else if(choose==1)
{
BFS(G,1);
break;
}
else
{
cout<<"输入错误,请重新输入:\n";
}
}
}