参考了目前的第二篇题解(原本思路是Astar但是想了想发现太耗时了),调了半个晚修但是没调好,难受啊,恳请大佬帮助。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define re register
#define N 50500
#define M 1000100
#define inf (1e18)
ll n, m, head[N], limit, in[N], cnt = 0;
ll x, y, z;
ll dis[5][N];
bool vis[N];
struct Edge{
ll to, nxt, val;
}e[M << 2];
inline void add_edge(ll u, ll v, ll w) {
e[++cnt].to = v;
e[cnt].val = w;
e[cnt].nxt = head[u];
head[u] = cnt;
}
void init() {
for(re ll i = 2; i < n; i++) {
for(ll j = head[i]; j; j = e[j].nxt) {
if(!vis[e[j].to]) {
in[i]++;
vis[e[j].to] = 1;
}
}
memset(vis, 0, sizeof(vis));
dis[1][i] = dis[2][i] = inf;
}
in[1] = in[n] = inf;
dis[1][n] = dis[2][n] = inf;
}
void SPFA() {
queue <ll> Q;
Q.push(1);
dis[1][1] = 0; dis[2][1] = inf;
while(!Q.empty()) {
ll u = Q.front();
Q.pop();
vis[u] = 0;
for(ll j = head[u]; j; j = e[j].nxt) {
if(in[e[j].to] < limit) continue;
if(dis[1][e[j].to] > dis[1][u] + e[j].val) {
dis[2][e[j].to] = dis[1][e[j].to];
dis[1][e[j].to] = dis[1][u] + e[j].val;
if(!vis[e[j].to]) { Q.push(e[j].to); vis[e[j].to] = 1;}
}
else if(dis[2][e[j].to] > dis[1][u] + e[j].val && dis[1][e[j].to] < dis[1][u] + e[j].val) {
dis[2][e[j].to] = dis[1][u] + e[j].val;
if(!vis[e[j].to]) { Q.push(e[j].to); vis[e[j].to] = 1;}
}
else if(dis[2][e[j].to] > dis[2][u] + e[j].val && dis[1][e[j].to] < dis[2][u] + e[j].val) {
dis[2][e[j].to] = dis[2][u] + e[j].val;
if(!vis[e[j].to]) { Q.push(e[j].to); vis[e[j].to] = 1;}
}
}
}
}
int main()
{
std::ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
std :: cin >> n >> m >> limit;
for(re ll i = 1; i <= m; i++) {
std :: cin >> x >> y >> z;
add_edge(x, y, z);
add_edge(y, x, z);
}
init();
SPFA();
std :: cout << (dis[2][n] == inf ? -1 : dis[2][n]);
return 0;
}