zoukankan      html  css  js  c++  java
  • 【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
    ",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.
    ",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.
    ",now,start,t);
    86     }
    87     return 0;
    88 }
  • 相关阅读:
    IOS GameCenter验证登陆
    BZOJ 1597: [Usaco2008 Mar]土地购买 斜率优化
    Hihocoder #1602 : 本质不同的回文子串的数量 manacher + BKDRhash
    HDU 5343 MZL's Circle Zhou 后缀自动机+DP
    HDU 6208 The Dominator of Strings 后缀自动机
    SPOJ SUBLEX
    SPOJ LCS2
    .NET平台技术体系梳理+初学者学习路径推荐+我们的愿景与目标
    扑克模拟,牌型判断java版
    一道综合练习题实践list及dictionary集合类
  • 原文地址:https://www.cnblogs.com/ldudxy/p/13041078.html
Copyright © 2011-2022 走看看