• P1346 电车


    P1346 电车

    提交 20.68k
    通过 6.92k
    时间限制 1.00s
    内存限制 125.00MB
    题目提供者 yeszy
    历史分数100

    提交记录

    查看算法标签
    进入讨论版

    相关讨论

     
    查看讨论

    推荐题目

     
    查看推荐
     

    展开

    题目描述

    在一个神奇的小镇上有着一个特别的电车网络,它由一些路口和轨道组成,每个路口都连接着若干个轨道,每个轨道都通向一个路口(不排除有的观光轨道转一圈后返回路口的可能)。在每个路口,都有一个开关决定着出去的轨道,每个开关都有一个默认的状态,每辆电车行驶到路口之后,只能从开关所指向的轨道出去,如果电车司机想走另一个轨道,他就必须下车切换开关的状态。

    为了行驶向目标地点,电车司机不得不经常下车来切换开关,于是,他们想请你写一个程序,计算一辆从路口 AAA 到路口 BBB 最少需要下车切换几次开关。

    输入格式

    第一行有 333 个整数 N,A,BN,A,BN,A,B(2≤N≤100,1≤A,B≤N2 leq N leq 100, 1 leq A,B leq N2N100,1A,BN),分别表示路口的数量,和电车的起点,终点。

    接下来有 NNN 行,每行的开头有一个数字 KiK_iKi0≤Ki≤N−10 leq K_i leq N-10KiN1),表示这个路口与 KiK_iKi 条轨道相连,接下来有 KiK_iKi 个数字表示每条轨道所通向的路口,开关默认指向第一个数字表示的轨道。

    输出格式

    输出文件只有一个数字,表示从 AAA 到 BBB 所需的最少的切换开关次数,若无法从 AAA 前往 BBB,输出 −1-11。

    输入输出样例

    输入 #1
    3 2 1
    2 2 3
    2 3 1
    2 1 2
    输出 #1
    0

    思路
      对于第一条边连0,之后的边连1跑dij
      由于数据比较水,第一发看错题交了发dfs暴力也有50P
    CODE
      1 #include <bits/stdc++.h>
      2 #define dbg(x) cout << #x << "=" << x << endl
      3 #define eps 1e-8
      4 #define pi acos(-1.0)
      5 
      6 using namespace std;
      7 typedef long long LL;
      8 
      9 template<class T>inline void read(T &res)
     10 {
     11     char c;T flag=1;
     12     while((c=getchar())<'0'||c>'9')if(c=='-')flag=-1;res=c-'0';
     13     while((c=getchar())>='0'&&c<='9')res=res*10+c-'0';res*=flag;
     14 }
     15 
     16 namespace _buff {
     17     const size_t BUFF = 1 << 19;
     18     char ibuf[BUFF], *ib = ibuf, *ie = ibuf;
     19     char getc() {
     20         if (ib == ie) {
     21             ib = ibuf;
     22             ie = ibuf + fread(ibuf, 1, BUFF, stdin);
     23         }
     24         return ib == ie ? -1 : *ib++;
     25     }
     26 }
     27 
     28 int qread() {
     29     using namespace _buff;
     30     int ret = 0;
     31     bool pos = true;
     32     char c = getc();
     33     for (; (c < '0' || c > '9') && c != '-'; c = getc()) {
     34         assert(~c);
     35     }
     36     if (c == '-') {
     37         pos = false;
     38         c = getc();
     39     }
     40     for (; c >= '0' && c <= '9'; c = getc()) {
     41         ret = (ret << 3) + (ret << 1) + (c ^ 48);
     42     }
     43     return pos ? ret : -ret;
     44 }
     45 
     46 const int maxn = 1e5 + 7;
     47 const int inf  = 0x3f3f3f3f;
     48 
     49 int head[maxn << 1], edge[maxn << 1], w[maxn << 1], nxt[maxn << 1];
     50 int cnt;
     51 
     52 inline void BuildGraph (int u, int v, int c) {
     53     cnt++;
     54     edge[cnt] = v;
     55     nxt[cnt]  = head[u];
     56     w[cnt] = c;
     57     head[u] = cnt;
     58 }
     59 
     60 struct node {
     61     int u,v;
     62     bool operator <(const node &t) const {
     63         return u > t.u;
     64     }
     65 };
     66 
     67 int n,m,s,t;
     68 int dis[maxn];
     69 
     70 priority_queue < node > q;
     71 
     72 void dijkstra(int s) {
     73     for (int i = 1; i <= n; ++i) {
     74         dis[i] = inf;
     75     }
     76     dis[s] = 0;
     77     node temp;
     78     temp.u = 0;
     79     temp.v = s;
     80     q.push(temp);
     81     while(!q.empty()) {
     82         int u = q.top().v;
     83         int d = q.top().u;
     84         q.pop();
     85         if(d != dis[u]) continue;
     86         for (int i = head[u]; i; i = nxt[i]) {
     87             int v = edge[i];
     88             int c = w[i];
     89             if(dis[v] > dis[u] + c) {
     90                 dis[v] = dis[u] + c;
     91                 node p;
     92                 p.u = dis[v], p.v = v;
     93                 q.push(p);
     94             }
     95         }
     96     }
     97 }
     98 
     99 int main()
    100 {
    101     scanf("%d %d %d",&n, &s, &t);
    102     for ( int i = 1; i <= n; ++i ) {
    103         int k;
    104         read(k);
    105         for ( int j = 1; j <= k; ++j ) {
    106             int x;
    107             read(x);
    108             if(j == 1) {
    109                 BuildGraph(i, x, 0);
    110             }
    111             else {
    112                 BuildGraph(i, x, 1);
    113             }
    114         }
    115     }
    116     dijkstra(s);
    117     if(dis[t] != inf) printf("%d
    ",dis[t]);
    118     else {
    119         puts("-1");
    120     }
    121     return 0;
    122 }
    View Code
    
    
    
    
    
  • 相关阅读:
    Asp.Net Core 轻松学-被低估的过滤器
    Asp.Net Core 轻松学-利用文件监视进行快速测试开发
    Asp.Net Core 轻松学-利用xUnit进行主机级别的网络集成测试
    Asp.Net Core 轻松学-HttpClient的演进和避坑
    Asp.Net Core 轻松学-基于微服务的后台任务调度管理器
    Asp.Net Core 轻松学-一行代码搞定文件上传
    .NET Core 2.2 新增部分功能使用尝鲜
    Asp.NetCore轻松学-业务重点-实现一个简单的手机号码验证
    Asp.Net Core 轻松学-实现跨平台的自定义Json数据包
    Asp.Net Core 轻松学-利用 Swagger 自动生成接口文档
  • 原文地址:https://www.cnblogs.com/orangeko/p/12329182.html
Copyright © 2020-2023  润新知