#include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <cmath > #include <queue> #include <stack> #include <algorithm>using namespace Std;const int maxn = + 10;s truct edge{int to, next;} Edge[maxn];int tot, Head[maxn];int VIS[MAXN], degree[maxn];int n;void addedge (int u, int v) {edge[tot].to = v; Edge[tot].next = Head[u]; Head[u] = tot++;} void init () {tot = 0; Memset (Head,-1, sizeof (head)); memset (degree, 0, sizeof (degree)); memset (Vis, 0, sizeof (VIS));} void dfs1 (int u) {vis[u] = 1; for (int i=head[u];i!=-1;i=edge[i].next) {int v = edge[i].to; if (!vis[v]) DFS1 (v); }}int cc;int ans[maxn][2];void dfs2 (int u) {for (int i=head[u];i!=-1;i=edge[i].next) {if (!vis[i]) { Vis[i] = 1; VIS[I^1] = 1; int v = edge[i].to; DFS2 (v); if (i%2 = = 0) ans[cc++][0] = I/2 + 1; else ans[cc++][1] = I/ 2 + 1; }}}int Main () {while (scanf ("%d", &n)!=eof) {int u, v; Init (); int root; for (int i=1;i<=n;i++) {scanf ("%d%d", &u, &v); root = u; Addedge (U, v); Addedge (V, u); degree[u]++; degree[v]++; } int count = 0; int flag = 1; Int St; for (int i=0;i<=6;i++) if (Degree[i] & 1) {count++; st = i; } if (! ( Count = = 0 | | Count = = 2)) flag = 0; else {DFS1 (root); for (int i=0;i<=6;i++) if (Degree[i] > 0 &&!vis[i]) {flag = 0; Break }} if (!flag) {printf ("No solution\n"); Continue } memset (Vis, 0, sizeof (VIS)); if (count = = 0) {DFS2 (root); } else DFS2 (ST); for (int. i=cc-1;i>=0;i--) {if (anS[i][0]) {printf ("%d +\n", ans[i][0]); } else printf ("%d-\n", ans[i][1]); }} return 0;}
SGU 101 Euler path with two sides of a non-direction graph