题目意思就是根据给出图,从1 到目标地点的路线有几条,是什么。
一开始普通回溯,超时了;
所以剪枝了一下,把不可到达目标地点的都给去掉了。(其实是把可到达的标记为可访问)
然后过了;
AC代码:
#include<iostream>
using namespace std;
const int N = 25;
int link[N][N];
int vis[N];
int vis2[N];
int target;
int num;
int city;
int res[N];
bool ok;
void init () {
for (int i = 0 ; i < N ;i++) {
for (int j = 0 ; j < N ;j++) {
link[i][j] = 0;
}
vis[i] = 1;
vis2[i] = 0;
}
num = 0;
city = 0;
}
void setvis() {
for (int i = 0 ; i < N ; i++) {
for (int j = 0 ; j < N ;j++) {
vis2[i] = 0;
}
}
}
void reach (int cur) {
if (cur == target) {
ok = true;
return ;
}
for (int i = 1 ; i < N ; i++) {
if (link[cur][i] && !vis2[i]) {
vis2[i] = 1;
reach(i);
}
}
}
void dfs(int cur ,int k) {
if (cur == target) {
num++;
for (int i = 0 ; i < k ;i++) {
if(i != 0)
cout << " ";
cout << res[i];
}
cout << endl;
return;
}
for (int i = 1 ; i < N ; i++) {
if (link[cur][i] && !vis[i]) {
vis[i] = 1;
res[k] = i;
dfs(i,k + 1);
vis[i] = 0;
}
}
}
int main () {
int T = 1;
int op ,ed;
while (cin >> target) {
init();
while (cin >> op >> ed) {
if (op + ed == 0)
break;
link[op][ed] = link[ed][op] = 1;
}
cout <<"CASE "<< T++<< ":"<<endl;
vis2[1] = 1;
res[0] = 1;
for (int i = 1 ; i < N ; i++) {
ok = false;
setvis();
reach(i);
if(ok)
vis[i] = 0;
}
vis[1] = 1;
dfs(1,1);
cout << "There are "<< num <<" routes from the firestation to streetcorner " << target << "." <<endl;
}
}