luogu P1346 电车 最短路

显然结论

一个点不会经过了两次,一个阀门不会反复开关。第一条边为0,其余边为1。

 1 #include <cstdio>
 2 #include <queue>
 3 using namespace std;
 4 int head[120],dis[120],to[30000],nxt[30000],val[30000];
 5 bool vis[120];
 6 int cnt,s,t,n;
 7
 8 struct pot
 9 {
10     int x,dis;
11     pot (int _x = 0,int _dis = 0) : x(_x),dis(_dis) {}
12     friend bool operator < (pot a,pot b)
13     {
14         return a.dis > b.dis;
15     }
16 };
17 priority_queue <pot> que;
18 void add(int x,int y,int v)
19 {
20     nxt[++cnt] = head[x];
21     to[cnt] = y;
22     head[x] = cnt;
23     val[cnt] = v;
24 }
25 void dijkstra()
26 {
27     for(int i=0; i<= n; i++) dis[i]=2e9;
28     que.push(pot(s,0));
29     dis[s]=0;
30     while(!que.empty())
31     {
32         pot now=que.top();
33         que.pop();
34         if(vis[now.x]) continue;
35         vis[now.x]=true;
36         for(int i = head[now.x]; i; i=nxt[i])
37         {
38             if(dis[to[i]]>dis[now.x]+val[i])
39             {
40                 dis[to[i]]=dis[now.x]+val[i];
41                 que.push(pot(to[i],dis[to[i]]));
42             }
43         }
44     }
45 }
46 int main()
47 {
48     scanf("%d%d%d",&n,&s,&t);
49     int tk,tmp;
50     for (int i = 1;i <= n;i++)
51     {
52         scanf("%d",&tk);
53         if (tk)
54         {
55             scanf("%d",&tmp);
56             add(i,tmp,0);
57         }
58         for (int o = 2;o <= tk;o++)
59         {
60             scanf("%d",&tmp);
61             add(i,tmp,1);
62         }
63     }
64     dijkstra();
65     if (dis[t] == dis[0]) printf("-1\n");
66     else printf("%d\n",dis[t]);
67     return 0;
68 }

原文地址:https://www.cnblogs.com/iat14/p/11219203.html

时间: 2024-10-14 23:14:53

luogu P1346 电车 最短路的相关文章

[最短路][模版]P1346 电车

题目描述 在一个神奇的小镇上有着一个特别的电车网络,它由一些路口和轨道组成,每个路口都连接着若干个轨道,每个轨道都通向一个路口(不排除有的观光轨道转一圈后返回路口的可能).在每个路口,都有一个开关决定着出去的轨道,每个开关都有一个默认的状态,每辆电车行驶到路口之后,只能从开关所指向的轨道出去,如果电车司机想走另一个轨道,他就必须下车切换开关的状态. 为了行驶向目标地点,电车司机不得不经常下车来切换开关,于是,他们想请你写一个程序,计算一辆从路口A到路口B最少需要下车切换几次开关. 输入输出格式

洛谷P1346 电车

P1346 电车 236通过 757提交 题目提供者yeszy 标签图论福建省历届夏令营 难度普及/提高- 提交该题 讨论 题解 记录 最新讨论 解不好啊,快疯了!!哪位大… 求解:为何除了-1的点之外都… 为什么会超时…… 题目描述 在一个神奇的小镇上有着一个特别的电车网络,它由一些路口和轨道组成,每个路口都连接着若干个轨道,每个轨道都通向一个路口(不排除有的观光轨道转一圈后返回路口的可能).在每个路口,都有一个开关决定着出去的轨道,每个开关都有一个默认的状态,每辆电车行驶到路口之后,只能从开

【Luogu】P1144最短路计数(BFS)

题目链接 此题使用BFS记录最短路的条数.思路如下:因为是无权无向图,所以只要被BFS到就是最短路径.因此可以记录该点的最短路和最短路的条数:如果点y还没被访问过,则记录dis[y],同时令ans[y]=ans[x]. 如果点y已经被访问过且当前为最短路径,则ans[y]+=ans[x] #include<cstdio> #include<cctype> inline long long read(){ long long num=0,f=1; char ch=getchar();

P1346 电车

懂得怎么建图就好做了,有些路权值为1,有些为0 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=10000; 4 const int maxm=50000; 5 const int INF=1e9; 6 7 inline int read() 8 { 9 int x=0,k=1;char c=getchar(); 10 while(c<'0'||c>'9') {if(c=='-') k=-1;c=g

【2019寒假集训DAY2】图论

Dijkstra 条件:无负权:时间:O(n*n) 详解+模板: https://www.cnblogs.com/jason2003/p/7222182.html (模板)P1821 [USACO07FEB]银牛派对Silver Cow Party:https://www.luogu.org/recordnew/show/12339877 void dj(){ for(int i=1;i<=m;i++) if(i!=k)dis[i]=M; for(int i=1;i<=m;i++){ int

[Luogu P3953] 逛公园 (最短路+拓扑排序+DP)

题面 传送门:https://www.luogu.org/problemnew/show/P3953 Solution 这是一道神题 首先,我们不妨想一下K=0,即求最短路方案数的部分分. 我们很容易可以想到一个做法,就是魔改迪杰斯特拉做法: 如果一个点可以更新到达其他点的距离,那个点的方案数就是这个点的方案数:如果一个点所更新出来的距离和之前的相等,那个点的方案数加等当前点的方案数. 用式子可以表现为: f[j]=f[i] (dis[j]>dis[i]+x)   f[j]+=f[i] (dis

Luogu P3403 跳楼机|同余最短路

题意:给出跳楼机的4个操作,分别为 1.向上移动\(x\)层: 2.向上移动\(y\)层: 3.向上移动\(z\)层: 4.回到第一层. 显然,并不需要 求从第一层开始,能到达\(1\)到\(h\)中的多少层? \(1<=h<=2^{63}-1\) \(1<=x, y, z<=100000\) 题解: 好像可以直接\(DP\)? 布星啊,看下数据范围. 那先来推推定理? 接下来假设\(x\le y\le z\) 对于一个数\(k\),若它能到达,则\(k+x,k+2x,k+...\

luogu P1144 最短路计数

题目描述 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: 输入第一行包含2个正整数N,M,为图的顶点数与边数. 接下来M行,每行两个正整数x, y,表示有一条顶点x连向顶点y的边,请注意可能有自环与重边. 输出格式: 输出包括N行,每行一个非负整数,第i行输出从顶点1到顶点i有多少条不同的最短路,由于答案有可能会很大,你只需要输出mod 100003后的结果即可.如果无法到达顶点i则输出0. 输入输出样例 输入样例#1

luogu【P1144】最短路计数

原题入口 这道题 一道有关于最短路的图论问题. 要求从1开始求解最短路的条数. 这个题十分有趣,首先,跑裸的spfa(或者dijkstra)算出从1开始的最短路的长度. 再其次,计数的话,可以用记忆化搜索(相当于DAG dp)我们现在所遍历的路径长度要刚好是最短路的长度. (这个程序中会有体现的) 这个题我前面一直在TLE,就是没有用记忆化,暴力去找路径.(第一遍还因为没算空间MLE..TAT) 后来优化后 时间效率挺不错.(500多ms) 下面上代码: 1 #include <bits/std