[练习]输入边构成无向图,求以顶点0为起点的深度优先遍历序列。
第一行为两个整数n、e,表示图顶点数和边数。以下e行每行两个整数,表示一条边的起点、终点,保证不重复、不失败。1≤n≤20,0≤e≤190,有多组测试数据)
Output
前面n行输出无向图的邻接矩阵,最后一行输出以顶点0为起点的深度优先遍历序列,对于任一起点,首先遍历的是终点序号最小的、尚未被访问的一条边。每个序号后输出一个空格。每组结果换行
Sample Input
4 5
0 1
0 3
1 2
1 3
2 3
Sample Output
0 1 0 1
1 0 1 1
0 1 0 1
1 1 1 0
0 1 2 3
C:
#include<stdio.h>
#define MAX_VERTEX_NUM 20
bool visited[MAX_VERTEX_NUM];
int count;
typedef struct ArcCell
{
intadj;
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct
{
intvexs[MAX_VERTEX_NUM];
AdjMatrixarcs;
intvexnum,arcnum;
}MGraph;
void CreateMG(MGraph &G)
{
inti,j,k,v1,v2;
scanf(“%d%d”,&G.vexnum,&G.arcnum);
for(i=0;i<G.vexnum;i++)
G.vexs[i]=i;
for(i=0;i<G.vexnum;i++)
{
for(j=0;j<G.vexnum;j++)
G.arcs[i][j].adj=0;
}
//初始化结束
for(k=0;k<G.arcnum;k++)
{
scanf(“%d%d”,&v1,&v2);
G.arcs[v1][v2].adj=1;
G.arcs[v2][v1].adj=G.arcs[v1][v2].adj;
}
for(i=0;i<G.vexnum;i++)
{
for(j=0;j<G.vexnum-1;j++)
printf(“%d”,G.arcs[i][j].adj);
printf(“%d\n”,G.arcs[i][G.vexnum-1].adj);
}
}
int FirstAdjVex(MGraph G,int v)
{
intj;
for(j=0;j<G.vexnum;j++)
{
if(G.arcs[v][j].adj==1)
returnj;
}
return-1;
}
int NextAdjVex(MGraph G,int v,int w)
{
intj;
for(j=w+1;j<G.vexnum;j++)
{
if(G.arcs[v][j].adj==1)
returnj;
}
return-1;
}
void DFS(MGraph G,int v)
{
intw;
visited[v]=true;
count++;
if(count<G.vexnum)
printf(“%d”,v);
elseprintf(“%d\n”,v);
for(w=FirstAdjVex(G,v);w!=-1;w=NextAdjVex(G,v,w))
{
if(!visited[w])
DFS(G,w);
}
}
void DFSTraverse(MGraph G)
{
intv;
for(v=0;v<G.vexnum;v++)
visited[v]=false;
for(v=0;v<G.vexnum;v++)
{
if(!visited[v])
DFS(G,v);
}
}
int main()
{
while(1)
{
count=0;
MGraphG;
CreateMG(G);
DFSTraverse(G);
}
return0;
}