#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX_VERTEX_NUM 30
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
typedef int Status;
typedef char VertexType[10];
typedef int AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
struct Graph
{
VertexType vexs[MAX_VERTEX_NUM];
AdjMatrix arcs;
int vexnum,arcnum;
};
int LocateVex(Graph G,VertexType u)
{
int i;
for(i=0; i<G.vexnum; ++i)
if(strcmp(u,G.vexs[i])==0)
return i;
return -1;
}
int FirstAdjVex(Graph G,int v)
{
int i,j=0,k;
for(i=0; i<G.vexnum; i++)
if(G.arcs[v][i]!=j)
return i;
return -1;
}
int NextAdjVex(Graph G,int v,int w)
{
int i,j=0,k1,k2;
for(i=w+1; i<G.vexnum; i++)
if(G.arcs[v][i]!=j)
return i;
return -1;
}
Status CreateAG(Graph &G)
{
int i,j;
scanf("%d",&G.vexnum);
for(i=0; i<G.vexnum; ++i)
scanf(" %s",G.vexs[i]);
for(i=0; i<G.vexnum; ++i)
for(j=0; j<G.vexnum; ++j)
scanf("%d",&G.arcs[i][j]);
return OK;
}
void visitFuc(Graph G,int v)
{
printf("%s ",G.vexs[v]);
}
void DFS(Graph G,int v,int visited[])
{
int w;
visitFuc(G,v);
visited[v]=TRUE;
for(w=FirstAdjVex(G,v); w>=0; w=NextAdjVex(G,v,w))
{
if(!visited[w])
DFS(G,w,visited);
}
}
void DFSTraverse(Graph G)
{
int visited[30];
int v;
for(v=0; v<G.vexnum; v++)
{
visited[v]=FALSE;
}
for(v=0; v<G.vexnum; v++)
{
if(!visited[v])
{
DFS(G,v,visited);
}
}
}
int main()
{
Graph G;
CreateAG(G);
DFSTraverse(G);
return 0;
}