刚做的时候不懂事, TLE好几次, 就放下了。
刚才突然有了灵感, 用set保存下能到目标点的路径, 然后判断就可以。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <set>
using namespace std;
const int maxv = 25;
int cnt, goal, Case(0);
int road[maxv] = {1}, G[maxv][maxv];
set<int > exist;
void dfs(int u, int size_) {
if(u == goal) {
cnt++;
for(int i = 0; i < size_; i++) {
if(i) cout << " ";
cout << road[i];
}
cout << endl;
}
for(int v = 2; v <= 20; v++) if(exist.count(v)){
bool ok = true;
for(int i = 0; i < size_; i++)
if(road[i] == v) {ok = false; break;}
if(ok&& G[u][v] == 1) {
G[v][u] = G[u][v] = -1;
road[size_] = v;
dfs(v, size_ + 1);
G[v][u] = G[u][v] = 1;
}
}
}
void ans() {
cout << "CASE " << ++Case << ":\n";
cnt = 0;
dfs(1, 1);
cout << "There are " << cnt;
cout << " routes from the firestation to streetcorner ";
cout << goal << ".\n";
}
int main() {
#ifndef ONLINE_JUDGE
freopen("test", "r", stdin);
#endif
while(cin >> goal) {
int u, v, cnt = 0;
while(cin >> u >> v&& u)
G[u][v] = G[v][u] = 1;
exist.insert(goal);
while(cnt != exist.size()) {
cnt = exist.size();
for(auto p : exist)
for(int i = 1; i < 20; i++)
if(G[i][p]&& !exist.count(i))
exist.insert(i);
}
ans();
exist.clear();
memset(G, 0, sizeof(G));
}
return 0;
}