Code:
#include <cstring>
#include <iostream>
#define MAXN 25
#define max(x, y) (x) > (y) ? (x) : (y)
int n, k, cnt, f[MAXN], next[MAXN];
bool g[MAXN][MAXN], vis[MAXN];
// 并查集判断是否连通
int find(int x) {
return f[x] == x ? f[x] : f[x] = find(f[x]);
}
void merge(int x, int y) {
int fx = find(x), fy = find(y);
if (fx != fy) {
f[fy] = fx;
}
}
void print_path() {// 输出路径
for (int u=1; u!=k; u=next[u])
std::cout << " " << u;
std::cout << " " << k << '\n';
}
void find_path(int u) {
if (find(u) != find(k)) return;
if (u == k) {
cnt++;
print_path();
return;
}
for (int v=1; v<=n; v++)
if (g[u][v] && !vis[v]) {
vis[v] = true;
next[u] = v;
find_path(v);
vis[v] = false;
}
}
void build_graph() { // 输入
int u, v;
while (std::cin >> u >> v && u != 0) {
g[u][v] = g[v][u] = true;
merge(u, v);
n = max(max(u, v), n);
}
}
int main(void) {
std::ios::sync_with_stdio(false);
int _case = 0;
while (std::cin >> k) {
cnt = 0;
memset(g, 0, sizeof(g));
memset(next, 0, sizeof(next));
for (int i=1; i<=MAXN; i++) f[i] = i;
build_graph();
std::cout << "CASE " << ++_case << ":\n";
vis[1] = true;
find_path(1);
vis[1] = false;
std::cout << "There are " << cnt << " routes from the"
<< " firestation to streetcorner " << k << ".\n";
}
return 0;
}