# include<iostream>
# include<cstring>
# include<queue>
using namespace std;
const int maxn=100;
bool visit[maxn];
typedef struct node{
int adj;//边之间关系
}arccell; //此处有的教材加了个 adj[maxn][maxn],然后在graph中定义 adj arcs 跟我直接定义二维数组是一样的。
typedef struct graph{
char vertex[maxn]; //顶点集合
arccell arcs[maxn][maxn];//邻接矩阵
int vertexnum,edgenum; //顶点数,边数.
}graph;
graph g;
queue<char> q;
int locate(graph g,char s)
{
int i;
for(i=0;i<g.vertexnum;i++)
{
if(g.vertex[i]==s)
return i;
}
if(i==g.vertexnum)
return -1;
}
bool input_graph(graph&g)
{
cin>>g.vertexnum>>g.edgenum;
for(int i=0;i<g.vertexnum;i++)
cin>>g.vertex[i]; //初始化顶点集
//初始化邻接矩阵
for(int i=0;i<g.vertexnum;i++)
for(int j=0;j<g.vertexnum;j++)
{
g.arcs[i][j].adj=0;
}
char v,u;
int m,w;
for(int i=0;i<g.edgenum;i++)
{
cin>>v>>u;
m=locate(g,v);
w=locate(g,u);
g.arcs[m][w].adj=1;
}
return true;
}
void output_arcs(graph g)
{
for(int i=0;i<g.vertexnum;i++)
{
for(int j=0;j<g.vertexnum;j++)
cout<<g.arcs[i][j].adj<<" ";
cout<<endl;
}
}
void dfs(int i)
{
visit[i]=true;
cout<<g.vertex[i];
for(int j=0;j<g.vertexnum;j++)
{
if(g.arcs[i][j].adj&&!visit[j])
dfs(j);
}
}
void bfs(int u)
{
q.push(g.vertex[u]);
while(!q.empty())
{
char ss=q.front();q.pop();
int i=locate(g,ss);
visit[i]=true;
cout<<ss<<" ";
for(int j=0;j<g.vertexnum;j++)
if(g.arcs[i][j].adj&&!visit[j])
{ visit[j]=true;
q.push(g.vertex[j]);
}
}
}
int main()
{
if(input_graph(g))
output_arcs(g);
memset(visit,0,sizeof(visit));//访问标记初始化.
for(int i=0;i<g.vertexnum;i++)
if(!visit[i]) bfs(i);
return 0;
}
如有错误,还请指出,不胜感激。