#include <iostream>
#include <istream>
#include <sstream>
#include <vector>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <cstring>
#include <unordered_map>
#include <unordered_set>
#include <algorithm>
#include <numeric>
#include <chrono>
#include <ctime>
#include <cmath>
#include <cctype>
#include <string>
#include <cstdio>
#include <iomanip>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <functional>
#include <iterator>
using namespace std;
const int maxn = 21;
int last,vis[maxn];
vector<int> matrix[maxn];
vector<vector<int> > ret;
int family[maxn];
int GetFather(int a){
return family[a] != a ? a = GetFather(family[a]) : a;
}
void AddOne(int a, int b){
int fa = GetFather(a);
int fb = GetFather(b);
if (fa != fb) family[fa] = family[fb];
}
void dfs(vector<int> &temp,int cur){
temp.push_back(cur);
vis[cur] = 1;
if (cur == last){
ret.emplace_back(temp);
temp.pop_back();
vis[cur] = 0;
return;
}
for (int i = 0; i < matrix[cur].size(); i++){
if (vis[matrix[cur][i]]) continue;
dfs(temp, matrix[cur][i]);
}
vis[cur] = 0;
temp.pop_back();
}
int main(){
int a, b,id = 0;
vector<int> temp;
while (cin >> last){
for (int i = 0; i < maxn; i++) {
matrix[i].clear();
family[i] = i;
}
memset(vis, 0, sizeof(vis));
ret.clear();
while (cin >> a >> b && a&&b){
matrix[a].push_back(b);
matrix[b].push_back(a);
AddOne(a, b);
}
for (int i = 0; i < maxn; i++) {
sort(matrix[i].begin(), matrix[i].end());
}
if (GetFather(1) == GetFather(last))
dfs(temp,1);
cout << "CASE " << ++id << ":" << endl;
for (int i = 0; i < ret.size(); i++){
for (int j = 0; j < ret[i].size(); j++){
if (j) cout << " ";
cout << ret[i][j];
}
cout << endl;
}
cout << "There are " << ret.size() << " routes from the firestation to streetcorner " << last << "." << endl;
}
return 0;
}
01-09
05-19
09-11
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交