做个记录:
BFS——queue实现
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
#define N 100
struct Graph
{
int vexnum;
int arcnum;
char vexs[N];
int arcs[N][N];
};
int Loc_vexs(Graph G, char a)
{
for(int i=1;i<=G.vexnum;i++)
{
if(G.vexs[i] == a)
{
return i;
}
}
}
void Input(Graph &G)
{
cin>>G.vexnum;
cin>>G.arcnum;
for(int i=1;i<=G.vexnum;i++)
{
cin>>G.vexs[i];
}
for(int i=1;i<=G.vexnum;i++)
{
for(int j=1;j<=G.vexnum;j++)
{
G.arcs[i][j] = 0;
}
}
for(int i=1;i<=G.arcnum;i++)
{
char a,b;
cin>>a>>b;
int x = Loc_vexs(G,a);
int y = Loc_vexs(G,b);
G.arcs[x][y] = 1;
}
}
void Bfs(Graph G)
{
int v[N];
memset(v,0,sizeof(v));
queue<int> q;
q.push(1);
v[1] = 1;
cout<<G.vexs[1]<<" ";
while(!q.empty())
{
int u = q.front();
for(int i=1;i<=G.vexnum;i++)
{
if(!v[i] && G.arcs[u][i]==1)
{
cout<<G.vexs[i]<<" ";
v[i] = 1;
q.push(i);
}
}
q.pop();
}
cout<<endl;
}
int main()
{
Graph G;
Input(G);
Bfs(G);
return 0;
}
bfs递归还未实现
DFS——stack实现
#include<iostream>
#include<cstring>
#include<stack>
using namespace std;
#define N 100
struct Graph
{
int vexnum;
int arcnum;
char vexs[N];
int arcs[N][N];
};
int Loc_vexs(Graph G, char a)
{
for(int i=1;i<=G.vexnum;i++)
{
if(G.vexs[i] == a)
{
return i;
}
}
}
void Input(Graph &G)
{
cin>>G.vexnum;
cin>>G.arcnum;
for(int i=1;i<=G.vexnum;i++)
{
cin>>G.vexs[i];
}
for(int i=1;i<=G.vexnum;i++)
{
for(int j=1;j<=G.vexnum;j++)
{
G.arcs[i][j] = 0;
}
}
for(int i=1;i<=G.arcnum;i++)
{
char a,b;
cin>>a>>b;
int x = Loc_vexs(G,a);
int y = Loc_vexs(G,b);
G.arcs[x][y] = 1;
}
}
void Dfs(Graph G)
{
int v[N];
memset(v,0,sizeof(v));
stack<int> s;
s.push(1);
v[1] = 1;
cout<<G.vexs[1]<<" ";
while(!s.empty())
{
int u = s.top();
int flag = 0;
for(int i=1;i<=G.vexnum;i++)
{
if(!v[i] && G.arcs[u][i]==1)
{
s.push(i);
cout<<G.vexs[i]<<" ";
v[i] = 1;
flag = 1;
break; // 仅此于bfs不同
}
}
if(flag==0) // 标记 u 此时为最深处 ,开始回溯
{
s.pop();
}
}
}
int main()
{
Graph G;
Input(G);
Dfs(G);
return 0;
}
DFS——递归实现
#include<iostream>
#include<cstring>
using namespace std;
#define N 100
struct Graph
{
int vexnum;
int arcnum;
char vexs[N];
int arcs[N][N];
};
int Loc_vexs(Graph G, char a)
{
for(int i=1;i<=G.vexnum;i++)
{
if(G.vexs[i] == a)
{
return i;
}
}
}
void Input(Graph &G)
{
cin>>G.vexnum;
cin>>G.arcnum;
for(int i=1;i<=G.vexnum;i++)
{
cin>>G.vexs[i];
}
for(int i=1;i<=G.vexnum;i++)
{
for(int j=1;j<=G.vexnum;j++)
{
G.arcs[i][j] = 0;
}
}
for(int i=1;i<=G.arcnum;i++)
{
char a,b;
cin>>a>>b;
int x = Loc_vexs(G,a);
int y = Loc_vexs(G,b);
G.arcs[x][y] = 1;
}
}
int v[N];
void Dfs(Graph G,int x)
{
cout<<G.vexs[x]<<" ";
v[x] =1;
for(int i=1;i<=G.vexnum;i++)
{
if(!v[i] && G.arcs[x][i]==1)
{
Dfs(G,i);
}
}
}
int main()
{
Graph G;
Input(G);
memset(v,0,sizeof(v));
Dfs(G,1); // 假设从vexs[1] 开始
return 0;
}