这题在搞清楚思路绕过坑后,还是可以写的出通过sample data的代码的。但是不能AC,让我很气。
最后查清原因:还是对dfs本质理解的不够。
wa代码:
vis[s]=1;
dfs(s,e,0);
殊不知本题有多个查询数据。如果只调用一遍还可以蒙混过关,但是这样的错误必然导致wa
ac代码:
vis[s]=1;
dfs(s,e,0);
vis[s]=0;
参考柳诺博客修改的AC代码:
#include <stdio.h> #include <memory.h> #include <math.h> #include <string> #include <vector> #include <set> #include <stack> #include <queue> #include <algorithm> #include <map> #define I scanf #define OL puts #define O printf #define F(a,b,c) for(a=b;a<c;a++) #define FF(a,b) for(a=0;a<b;a++) #define FG(a,b) for(a=b-1;a>=0;a--) #define LEN 10000 #define MAX 0x06FFFFFF #define V vector<int> using namespace std; vector<int> g[LEN]; int line[LEN][LEN]; int vis[LEN]; vector<int> path; vector<int> ans; int min_d=MAX; int min_ls=MAX; int N,M,K; int calc_ls(){ int cnt=-1,preLine=0; for(int i=1;i<path.size();i++){ if(line[path[i-1]][path[i]]!=preLine) cnt++; preLine=line[path[i-1]][path[i]]; } return cnt; } void dfs(int s,int e,int d){ if(s==e){ int ls=calc_ls(); if(d<min_d || (d==min_d && ls<min_ls)){ min_d=d; min_ls=ls; ans=path; } return; } int i; FF(i,g[s].size()){ int o=g[s][i]; if(!vis[o]){ vis[o]=1; path.push_back(o); dfs(o,e,d+1); vis[o]=0; path.pop_back(); } } } void printLine(){ int s=ans[0]; int preL=0; int i; F(i,1,ans.size()){ if(line[ans[i-1]][ans[i]]!=preL){ if(preL) printf("Take Line#%d from %04d to %04d.\n",preL,s,ans[i-1]); s=ans[i-1]; preL=line[ans[i-1]][ans[i]]; } } printf("Take Line#%d from %04d to %04d.\n",preL,s,ans[i-1]); } int main(){ // freopen("1131.txt","r",stdin); int s,e,i,j; I("%d",&N); F(i,1,N+1){ int pre,p=-1; I("%d",&M); while(M--){ pre=p; I("%d",&p); if(pre>=0){ g[p].push_back(pre); g[pre].push_back(p); line[p][pre]=i; line[pre][p]=i; } } } I("%d",&K); while(K--){ min_d=MAX; min_ls=MAX; path.clear(); ans.clear(); I("%d%d",&s,&e); path.push_back(s); vis[s]=1; dfs(s,e,0); vis[s]=0; O("%d\n",min_d); printLine(); } return 0; }