#include<bits/stdc++.h>
#define MaxInt 2e9
#define MVNum 100
#define OK 1
#define ERROR 0
using namespace std;
typedef char VerTexType;
typedef int Status;
typedef int ArcType;
bool visit[MVNum];
typedef struct
{
VerTexType vex[MVNum];
ArcType arcs[MVNum][MVNum];
int vexnum,arcnum;
}AMGraph;
int LocateVex(AMGraph &G,char &v)
{
int i;
for (i=0;i<G.vexnum;i++)
{
if (G.vex[i]==v)
return i;
}
if (i>=G.vexnum) return ERROR;
else return 0;
}
Status CreateUDN(AMGraph &G)
{
int i,j,k;
char v1,v2;
printf("输入图的顶点数:");
scanf("%d",&G.vexnum);
printf("输入边的条数:");
scanf("%d",&G.arcnum);
printf("输入各个点的信息:\n");
for (i=0;i<G.vexnum;i++)
cin>>G.vex[i];
for (i=0;i<G.vexnum;i++)
for (j=0;j<G.vexnum;j++)
G.arcs[i][j] = 0;
printf("\n输入由两个顶点构成的边:\n");
for (k=0;k<G.arcnum;k++)
{
cin>>v1>>v2;
i = LocateVex(G,v1);
j = LocateVex(G,v2);
G.arcs[i][j] = 1;
G.arcs[j][i] = 1;
}
printf("\n图创建成功!\n");
return OK;
}
void dfs(AMGraph G, int i)
{
int j,k;
stack<int> s;
s.push(i);
printf("%c ",G.vex[i]);
visit[i] = 1;
while(!s.empty())
{
i = s.top();
for(j=0;j<G.vexnum;j++)
{
if(G.arcs[i][j]!=0 && !visit[j])
{
s.push(j);
printf("%c ",G.vex[j]);
visit[j] = 1;
i = j;
j = 0;
}
}
if(!s.empty())
s.pop();
}
}
void DFS(AMGraph G,int k)
{
visit[k] = 1;
printf("%c ",G.vex[k]);
for (int w=0;w<G.vexnum;w++)
if (G.arcs[k][w]!=0 && !visit[w])
DFS(G,w);
}
void DFSTravel(AMGraph G)
{
printf("\nDFS递归遍历:\n");
memset(visit,0,sizeof(visit));
for (int i=0;i<G.vexnum;i++)
if (!visit[i])
DFS(G,i);
printf("\n");
printf("\nDFS非递归遍历:\n");
memset(visit,0,sizeof(visit));
for (int i=0;i<G.vexnum;i++)
if (!visit[i])
dfs(G,i);
printf("\n");
}
void BFS(AMGraph G,int k)
{
queue<int> q;
memset(visit,0,sizeof(visit));
if (!visit[k])
{
visit[k] = 1;
printf("%c ",G.vex[k]);
q.push(k);
}
while (!q.empty())
{
int t = q.front();
q.pop();
for (int w=0;w<G.vexnum;w++)
{
if (G.arcs[t][w]!=0 && !visit[w])
{
visit[w] = 1;
printf("%c ",G.vex[w]);
q.push(w);
}
}
}
}
void BFSTravel(AMGraph G)
{
printf("\nBFS遍历:\n");
memset(visit,0,sizeof(visit));
for (int i=0;i<G.vexnum;i++)
if (!visit[i])
BFS(G,i);
printf("\n");
}
int main()
{
AMGraph G;
CreateUDN(G);
DFSTravel(G);
BFSTravel(G);
return 0;
}