#include<stdio.h>
#include<stdlib.h>
#define MAXVEX 60
typedef int WeightType;
typedef int Elemtype;
typedef struct EdgeNode
{
int adjvex;
int data;
WeightType weight;
struct EdgeNode *next;
}EdgeNode;
typedef struct VexNode
{
EdgeNode *firstarc;
}VexNode, AdjList[MAXVEX];
typedef struct GraphADJ{
AdjList adjlist;
int numvex, numedge;
}GraphADJ;
void InitGraph(GraphADJ *G,int n)
{
int i;
G->numvex = n;
for(i=0; i<n; i++)
{
G->adjlist[i].firstarc= NULL;
}
}
void InsertEdge(GraphADJ *G,int s,int t,int w)
{
EdgeNode *newn = (EdgeNode *)malloc(sizeof(EdgeNode));
newn->adjvex = t;
newn->weight = w;
newn->next=G->adjlist[s].firstarc;
G->adjlist[s].firstarc=newn;
}
int LocateEdge(GraphADJ G,int s,int t)
{
EdgeNode *p = G.adjlist[s].firstarc;
while(p!=NULL)
{
if(p->adjvex == t)
return 0;
p = p->next;
}
return 1;
}
void Create(GraphADJ *G,int n)
{
int i,j,x,k=0,t;
int a[60][60],visit[60],b[60];
InitGraph(G,n);
for(i=0;i<n;i++)
visit[i]=0;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);
for(i=0;i<n;i++)
for(j=n-1;j>=0;j--)
{
if(a[i][j]==1)
InsertEdge(G,i,j,1);
}
EdgeNode *p;
i=0;
while(k==0)
{
j=0,t=0;
printf("%d ",i);
do
{
p=G->adjlist[i].firstarc;
visit[i]=1;
while(p!=NULL)
{
i=p->adjvex;
if(visit[i]!=1)
{
b[j++]=i;
visit[i]=1;
printf("%d ",i);
}
p=p->next;
}
i=b[t];
b[t]=-1;
t++;
}while(t<=j);
for(i=0;i<n;i++)
{
if(visit[i]==1)
k=1;
else
{
k=0;
break;
}
}
}
}
void main()
{
int n;
scanf("%d",&n);
GraphADJ G;
Create(&G,n);
printf("\n");
}
/**************************************************************
Problem: 2160
User: admin
Language: C
Result: Accepted
Time:16 ms
Memory:1144 kb
****************************************************************/