<—点个赞吧QwQ
宣传一下算法提高课整理
有一天,琪琪想乘坐公交车去拜访她的一位朋友。
由于琪琪非常容易晕车,所以她想尽快到达朋友家。
现在给定你一张城市交通路线图,上面包含城市的公交站台以及公交线路的具体分布。
已知城市中共包含 $n$ 个车站(编号$1$~$n$)以及 $m$ 条公交线路。
每条公交线路都是 单向的,从一个车站出发直接到达另一个车站,两个车站之间可能存在多条公交线路。
琪琪的朋友住在 $s$ 号车站附近。
琪琪可以在任何车站选择换乘其它公共汽车。
请找出琪琪到达她的朋友家(附近的公交车站)需要花费的最少时间。
输入格式
输入包含多组测试数据。
每组测试数据第一行包含三个整数 $n,m,s$,分别表示车站数量,公交线路数量以及朋友家附近车站的编号。
接下来 $m$ 行,每行包含三个整数 $p,q,t$,表示存在一条线路从车站 $p$ 到达车站 $q$,用时为 $t$。
接下来一行,包含一个整数 $w$,表示琪琪家附近共有 $w$ 个车站,她可以在这 $w$ 个车站中选择一个车站作为始发站。
再一行,包含 $w$ 个整数,表示琪琪家附近的 $w$ 个车站的编号。
输出格式
每个测试数据输出一个整数作为结果,表示所需花费的最少时间。
如果无法达到朋友家的车站,则输出 -1。
每个结果占一行。
数据范围
$n \le 1000, m \le 20000$,
$1 \le s \le n$,
$0 < w < n$,
$0 < t \le 1000$
输入样例:
5 8 5
1 2 2
1 5 3
1 3 4
2 4 7
2 5 6
2 3 5
3 5 1
4 5 1
2
2 3
4 3 4
1 2 3
1 3 4
2 3 2
1
1
输出样例:
1
-1
思路
没啥好说,建个反向图,从$1$跑最短路,到每个点的距离就是从每个点到$1$的最短距离。
代码
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
const int N = 1010,M = 200010,INF = 0x3f3f3f3f;
int n,m,s;
int h[N],e[M],w[M],ne[M],idx;
bool st[N];
int dist[N];
void add (int a,int b,int c) {
e[idx] = b;
w[idx] = c;
ne[idx] = h[a];
h[a] = idx++;
}
void spfa () {
memset (dist,0x3f,sizeof (dist));
memset (st,false,sizeof (st));
queue <int> q;
dist[s] = 0;
st[s] = true;
q.push (s);
while (!q.empty ()) {
int t = q.front ();
q.pop ();
st[t] = false;
for (int i = h[t];~i;i = ne[i]) {
int j = e[i];
if (dist[j] > dist[t]+w[i]) {
dist[j] = dist[t]+w[i];
if (!st[j]) {
st[j] = true;
q.push (j);
}
}
}
}
}
int main () {
while (cin >> n >> m >> s) {
memset (h,-1,sizeof (h));
while (m--) {
int a,b,c;
cin >> a >> b >> c;
add (b,a,c);
}
int q,ans = INF;
spfa ();
cin >> q;
for (int i = 1;i <= q;i++) {
int x;
cin >> x;
ans = min (ans,dist[x]);
}
if (ans == INF) puts ("-1");
else cout << ans << endl;
}
return 0;
}
AcWing为什么永远不卡菊花图
incra老弟能不能解释一下为什么建立反向图跑dijkstra不行?
这不是做法吗,哪里错了
我跑dijkstra没成
贴个代码
找到问题出在哪儿了,代码还是贴一下吧,我觉得我除了没注释以外,编码习惯还挺好的
另外我把出问题的地方在代码里边注释出来了
O2 + cin优化,时长188ms
哦,你枚举边是
i!=0
,我们一般用i!=-1
,即~i
我把tot初值设为2是为了便于取得反向边(i ^ 1),二分图匹配中需要用到这个,然后带到了所有链式前向星存储法的图论问题里边
嗯,如果用
~i
可以设为0,这种情况我也错过