【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 }

 

posted @ 2020-06-04 00:35  sewage  阅读(108)  评论(0编辑  收藏  举报