没理解刘汝佳的提示,直接DFS,果断超时 。 后来明白了我的DFS中将所有的点和边都遍历了一遍,这其中有大量的无效边,这些道路根本无法到达K; 所以加了一个优化,从K点开始将所有能和K联通的点用ans[][]数组标记上,这样就可以变相剪枝,省掉很多情况,耗时0.059。然后我又用BFS来实现了这个优化,发现又节省了不少时间,时间0.022
#include<bits/stdc++.h>
using namespace std;
int k,a,b,A[25],kase,vis[25],ans[25];
vector<int> G[25];
void bfs_k() {
queue<int> q;
q.push(k);
while(!q.empty()) {
int u = q.front(); q.pop() ;
for(int i=0;i<G[u].size();i++) {
int v = G[u][i];
if(!vis[v]) {
q.push(v); vis[v] = 1;
ans[v] = 1;
}
}
}
}
void dfs(int cur) {
if(A[cur-1]==k) {
printf("%d",A[0]);
for(int i=1;i<cur;i++) printf(" %d",A[i]);
printf("\n"); kase++; return ;
}
for(int i=0;i<G[A[cur-1]].size();i++){
int v = G[A[cur-1]][i];
if(!vis[v]&&ans[v]) {
vis[v] = 1;
A[cur] = v;
dfs(cur+1);
vis[v] = 0;
}
}
}
int main() {
int maxn = 0;
while(scanf("%d",&k)!=EOF) {
while(scanf("%d%d",&a,&b)!=EOF) {
if(a==0&&b==0) break;
G[a].push_back(b);
G[b].push_back(a);
}
for(int i=1;i<=20;i++) sort(G[i].begin(),G[i].end());
printf("CASE %d:\n",++maxn);
memset(ans,0,sizeof(ans));
memset(vis,0,sizeof(vis));
kase = 0;
vis[k] = 1; ans[k] = 1;
bfs_k() ;
memset(vis,0,sizeof(vis));
A[0] = 1; vis[1] = 1;
dfs(1);
printf("There are %d routes from the firestation to streetcorner %d.\n",kase,k);
for(int i=1;i<=20;i++) G[i].clear();
}
return 0;
}
下面给出用DFS的优化
/*void dfs_k(int cur) {
if(!G[cur].empty())
for(int i=0;i<G[cur].size();i++) {
int v = G[cur][i] ;
if(!vis[v]) {
vis[v] = 1;
ans[v] = 1;
dfs_k(v);
vis[v] = 0;
}
}
}*/