//오일러 경로 / 회로 구하는 코드
#include <iostream>
#include <stack>
using namespace std;
int n;
int degree[1001];
int adj[1001][1001]; //adj[i][j] : i -> j로 가는 간선의 수
void dfs(int n, stack<int>& E)
{
for (int i = 1; i <= n; i++)
{
if (adj[n][i] > 0)
{
//양방향 그래프이므로 양쪽으로 지워준다
adj[n][i]--;
adj[i][n]--;
dfs(i, E);
}
}
E.push(n);
}
stack<int> get_Euler()
{
stack<int> E;
dfs(n, E);
return E;
}
int main()
{
cin >> n;
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++)
cin>>adj[i][j];
}
//입력 및 필요충분조건 확인 함수 생략
stack<int> Euler;
Euler = get_Euler();
while(!Euler.empty())
{
cout<<Euler.top()<<' ';
Euler.pop();
}
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++)
cout<<adj[i][j];
cout<<endl;
}
}
Ly/smKTsnbzrn6wg6rK966GcIC8g7ZqM66GcIOq1rO2VmOuKlCDsvZTrk5wKI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RhY2s+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CmludCBuOwppbnQgZGVncmVlWzEwMDFdOwppbnQgYWRqWzEwMDFdWzEwMDFdOyAvL2FkaltpXVtqXSA6IGkgLT4gauuhnCDqsIDripQg6rCE7ISg7J2YIOyImAogCnZvaWQgZGZzKGludCBuLCBzdGFjazxpbnQ+JiBFKQp7Cglmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspCgl7CgkJaWYgKGFkaltuXVtpXSA+IDApCgkJewoJCQkvL+yWkeuwqe2WpSDqt7jrnpjtlITsnbTrr4DroZwg7JaR7Kq97Jy866GcIOyngOybjOykgOuLpAoJCQlhZGpbbl1baV0tLTsKCQkJYWRqW2ldW25dLS07CgkJCWRmcyhpLCBFKTsKCQl9Cgl9CglFLnB1c2gobik7Cn0KIApzdGFjazxpbnQ+IGdldF9FdWxlcigpCnsKCXN0YWNrPGludD4gRTsKCWRmcyhuLCBFKTsKCXJldHVybiBFOwp9CiAKaW50IG1haW4oKQp7CgljaW4gPj4gbjsKCWZvcihpbnQgaT0xOyBpPD1uOyBpKyspCgl7CgkJZm9yKGludCBqPTE7IGo8PW47IGorKykKCQkJY2luPj5hZGpbaV1bal07Cgl9CgkvL+yeheugpSDrsI8g7ZWE7JqU7Lap67aE7KGw6rG0IO2ZleyduCDtlajsiJgg7IOd6561CglzdGFjazxpbnQ+IEV1bGVyOwoJRXVsZXIgPSBnZXRfRXVsZXIoKTsKCXdoaWxlKCFFdWxlci5lbXB0eSgpKQogICAgICAgIHsKICAgICAgICAgICAgY291dDw8RXVsZXIudG9wKCk8PCcgJzsKICAgICAgICAgICAgRXVsZXIucG9wKCk7CiAgICAgICAgfQogCglmb3IoaW50IGk9MTsgaTw9bjsgaSsrKQoJewoJCWZvcihpbnQgaj0xOyBqPD1uOyBqKyspCgkJCWNvdXQ8PGFkaltpXVtqXTsKCQljb3V0PDxlbmRsOwoJfQp9Cg==