55pt代码求调!炫光!

P4568 [JLOI2011] 飞行路线

@[Half_Monkey](/user/326254) 帮你调好了: ```cpp #include<bits/stdc++.h> #define int long long using namespace std; struct node{ int to, w; }; vector<node> vec[300100]; int vis[300100], dis[300100], ans=99999999; signed main() { ios::sync_with_stdio(0); cin.tie(0); int n, m, k; cin >> n >> m >> k; int s, t; cin >> s >> t; for(int i=1; i<=m; ++i) { int u, v, w; cin >> u >> v >> w; vec[u].push_back({v,w}); vec[v].push_back({u,w}); for(int j=1; j<=k; ++j) { vec[v+(j-1)*n].push_back({u+n*j,0}); vec[u+(j-1)*n].push_back({v+n*j,0}); vec[v+n*j].push_back({u+n*j,w}); vec[u+n*j].push_back({v+n*j,w}); } } priority_queue<pair<int,int> > que; que.push({0, s}); memset(dis, 0x7f, sizeof dis); dis[s] = 0; while(!que.empty()) { int index = que.top().second; que.pop(); if(vis[index]) continue; vis[index] = 1; for(int i=0; i<vec[index].size(); ++i) { if(dis[vec[index][i].to] > dis[index] + vec[index][i].w) { dis[vec[index][i].to] = dis[index] + vec[index][i].w; que.push({-dis[vec[index][i].to], vec[index][i].to}); } } } for(int i=0;i<=k;i++)ans=min(ans,dis[t+i*n]); cout << ans; return 0; } ```
by w9095 @ 2023-07-25 13:05:14


@[Half_Monkey](/user/326254) ~~蓝勾巨佬先%为敬~~ 问题: $1$:建边的时候,你只建第 $0$ 层到其余层的边,没有考虑到层与层之间的相互转移。 $2$:[警示后人](https://www.luogu.com.cn/discuss/639017) 里面的第 $2$ 条。
by w9095 @ 2023-07-25 13:08:48


P.S:你的建边方法似乎也可以,但是应该建 $(t+n\times i)\to (t+n\times (i-1))$ 的边吧(没试过,不敢确定
by w9095 @ 2023-07-25 13:10:32


@[w9095](/user/569235) 感谢
by LonginusMonkey @ 2023-07-25 13:35:06


|