# include<iostream>
# include<cstring>
# include<queue>
using namespace std;
const int maxn=100;
typedef struct arcnode{
int adjvex; //该弧指向顶点位置
struct arcnode* nextarcs; //指向下一条弧的指针
}arcnode;
typedef struct vnode{
int data; //顶点信息
arcnode *firstarc; //指向依附该顶点的第一条弧的指针
}vnode;
typedef struct graph{
vnode vertics[maxn]; //邻接表
int verticnum,edgenum;//顶点数,边数.
}graph;
graph g;
bool visit[maxn];
bool input_graph(graph &g)
{
cin>>g.verticnum>>g.edgenum;
for(int i=0;i<g.verticnum;i++)
{
cin>>g.vertics[i].data;
g.vertics[i].firstarc=NULL;
}
for(int i=0;i<g.edgenum;i++)
{
int v,u;
cin>>v>>u;
arcnode *s=new arcnode();
s->adjvex=u-1;
s->nextarcs=g.vertics[v-1].firstarc; //头插法
g.vertics[v-1].firstarc=s;
}
return true;
}
void output_vertics(graph g)
{
for(int i=0;i<g.verticnum;i++)
{
arcnode *s;
cout<<g.vertics[i].data;
s=g.vertics[i].firstarc;
while(s)
{
cout<<"->"<<s->adjvex<<" ";
s=s->nextarcs;
}
cout<<endl;
}
}
void bfs(int u)
{
queue<int> q;
q.push(u);
visit[u]=true;
while(!q.empty())
{
int w=q.front();q.pop();
cout<<g.vertics[w].data<<" ";
arcnode *s=g.vertics[w].firstarc;
while(s)
{
if(!visit[s->adjvex])
{
q.push(s->adjvex);
visit[s->adjvex]=true;
}
s=s->nextarcs;
}
}
}
void dfs(int i)
{
visit[i]=true;
cout<<g.vertics[i].data;
arcnode *s=g.vertics[i].firstarc;
while(s)
{
if(!visit[s->adjvex])
dfs(s->adjvex);
s=s->nextarcs;
}
}
int main()
{
input_graph(g);
output_vertics(g);
memset(visit,0,sizeof(visit));
for(int i=0;i<g.verticnum;i++)
if(!visit[i]) bfs(i);
return 0;
}
//这里需要注意的是由于邻接表不唯一,(因各个边结点的链入顺序是任意的。
),所以按dfs,和bfs访问图,得到的序列不同,但只要符合bfs,dfs的特性就是正确的。