第1个回答 2016-07-13
#include <iostream>
#include <string>
#include <queue>
using namespace std;
int FirstAdjVex(int v);
int NextAdjVex(int v, int w);
void DFS(int v); //从顶点v开始对图做深度优先遍历, v是顶点数组的下标
void BFS(int v); //从顶点v开始对图做广度优先遍历,v是顶点数组的下标
int find(string a,int n);
int visited[10]={0};
int traver[10][10]={0};
string name[10];
int main()
{
int n,m,i,j,k;
string a,b;
//freopen("Traver.txt","r",stdin);
cin>>n;
cin>>m;
for(i=0; i<n; i++)
{
cin>>a;
name[i] = a;
}
for(i=0; i<m;i++){
cin>>a;
cin>>b;
j = find(a,n);
k = find(b,n);
traver[j][k] = 1;
traver[k][j] = 1;
}
for(i=0; i<n; i++){
if(visited[i] == 0)
DFS(i);
}
cout<<"\n";
for(i=0; i<n; i++){
visited[i] = 0;
}
for(i=0; i<n; i++){
if(visited[i] == 0)
BFS(i);
}
cout<<"\n";
return 0;
}
//寻找函数
int find(string a,int n){
int i;
for(i=0; i<n; i++){
if(a == name[i])
return i;
}
return -1;
}
int FirstAdjVex(int v)
{
int i;
//从编号大的邻接点开始访问
for (i = 9; i >= 0; i--)
{
if (traver[v][i] == 1)
return i;
}
return -1;
}
int NextAdjVex(int v, int w)
{
int i;
for (i = w - 1; i >= 0; i--)
{
if (traver[v][i] == 1)
return i;
}
return -1;
}
void DFS(int v)
{
int w;
//访问顶点v(输出顶点v的名字)
cout<<name[v]<<" ";
visited[v] = 1;
//找到顶点v的第一个邻接点w
for (w = FirstAdjVex(v); w >= 0; w = NextAdjVex(v, w))
{
//如果w没有访问过,对顶点w做深度优先搜索
if (visited[w] == 0)
DFS(w);
}
}
void BFS(int v) //从顶点v开始对图做广度优先遍历,v是顶点数组的下标
{
int w, u;
queue<int> myqueue; //定义一个队列,元素是顶点的下标
//把顶点v入队
myqueue.push(v);
cout<<name[v]<<" ";
visited[v] = 1;
while (!myqueue.empty())
{//当队列不为空时进入循环
//取队头元素
u = myqueue.front();
//队头元素出队
myqueue.pop();
//把u的所有邻接点入队
w = FirstAdjVex(u);
while (w >= 0)
{
if (visited[w] == 0)
{
//访问w
cout<<name[w]<<" ";
visited[w] = 1;
//w入队
myqueue.push(w);
}
w = NextAdjVex(u, w);
}
}
}本回答被提问者和网友采纳