【PAT甲级】1131 Subway Map (30分)(DFS)
题意:
输入一个正整数N(<=100),表示地铁的路线数量,接着输入N行每行包括一个正整数M(<=100),表示该条地铁站数,接着输入M个0000~9999的正整数表示地铁站的序号。
输入一个正整数K(<=10),表示询问的次数,每次输入两个地铁站的序号表示起点和终点,输出中间经过的站数-1,输出转乘路线。以长度短为第一优先,转乘次数少为第二优先。
AAAAAccepted code:
1 #define HAVE_STRUCT_TIMESPEC 2 #include<bits/stdc++.h> 3 using namespace std; 4 int con[10007][10007]; 5 vector<int>v[10007]; 6 bool vis[10007]; 7 int ans; 8 int inter; 9 vector<int>path,temp; 10 void dfs(int now,int t,int val,int conj,int line){ 11 if(now==t){ 12 if(val<ans){ 13 path=temp; 14 ans=val; 15 inter=conj; 16 return ; 17 } 18 else if(val==ans){ 19 if(conj<inter){ 20 path=temp; 21 inter=conj; 22 return ; 23 } 24 } 25 } 26 for(int i=0;i<v[now].size();++i){ 27 if(!vis[v[now][i]]){ 28 vis[v[now][i]]=1; 29 temp.emplace_back(v[now][i]); 30 int flag=con[now][v[now][i]]; 31 if(flag!=line&&line) 32 dfs(v[now][i],t,val+1,conj+1,flag); 33 else 34 dfs(v[now][i],t,val+1,conj,flag); 35 temp.pop_back(); 36 vis[v[now][i]]=0; 37 } 38 } 39 } 40 int main(){ 41 //ios::sync_with_stdio(false); 42 //cin.tie(NULL); 43 //cout.tie(NULL); 44 int n; 45 scanf("%d",&n); 46 for(int i=1;i<=n;++i){ 47 int m; 48 scanf("%d",&m); 49 int pre=0; 50 for(int j=1;j<=m;++j){ 51 int x; 52 scanf("%d",&x); 53 if(j>1){ 54 con[x][pre]=con[pre][x]=i; 55 v[x].emplace_back(pre); 56 v[pre].emplace_back(x); 57 } 58 pre=x; 59 } 60 } 61 int k; 62 scanf("%d",&k); 63 for(int i=1;i<=k;++i){ 64 memset(vis,0,sizeof(vis)); 65 path.clear(); 66 temp.clear(); 67 int s,t; 68 scanf("%d%d",&s,&t); 69 temp.emplace_back(s); 70 ans=1e9; 71 inter=1e9; 72 vis[s]=1; 73 dfs(s,t,0,0,0); 74 printf("%d\n",ans); 75 int now=-1; 76 int start=s; 77 for(int it=1;it<path.size();++it){ 78 if(con[path[it-1]][path[it]]!=now){ 79 if(now!=-1) 80 printf("Take Line#%d from %04d to %04d.\n",now,start,path[it-1]); 81 start=path[it-1]; 82 now=con[path[it-1]][path[it]]; 83 } 84 } 85 printf("Take Line#%d from %04d to %04d.\n",now,start,t); 86 } 87 return 0; 88 }
保持热爱 不懈努力
不试试看怎么知道会失败呢(划掉)
世上无难事 只要肯放弃(划掉)