蒟蒻求调,用的分层图+Dijkstra
只有10pts,#7 (输出-1) AC,#1,2,8~10 WA,#3~6 RE(signal 11 Segmentation Fault)
样例输出7, std: 4
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1000, MAXK = 999, INF = 0x3f3f3f3f;
int n, p, k, a, b, l;
struct Edge
{
int v, w;
};
inline int get_node_id(const int &u, const int &k) { return k * (n + 1) + u; }
vector<Edge> e[(MAXN + 5) * (MAXK + 5)];
inline void addEdge(const int &u, const int &v, const int &w, const int &k)
{
for (int i = 0; i < k; ++i)
e[get_node_id(u, i)].push_back({get_node_id(v, i), w});
for (int i = 1; i < k; ++i)
e[get_node_id(u, i - 1)].push_back({get_node_id(v, i), 0});
}
int dist[MAXN];
bool vis[MAXN];
void dijkstra(const int &start, const int &N)
{
memset(dist, 0x3f, sizeof dist);
dist[start] = 0;
typedef pair<int, int> Node;
priority_queue<Node, vector<Node>, greater<Node>> pq;
pq.push({start, 0});
while (!pq.empty())
{
auto now = pq.top();
pq.pop();
int u = now.first, d = now.second;
if (vis[u])
continue;
vis[u] = true;
for (const auto &i : e[u])
{
if (dist[i.v] > max(d, i.w))
{
dist[i.v] = max(d, i.w);
pq.push({i.v, dist[i.v]});
}
}
}
}
signed main()
{
cin >> n >> p >> k;
for (int i = 0; i < p; ++i)
{
cin >> a >> b >> l;
addEdge(a, b, l, k);
addEdge(b, a, l, k);
}
dijkstra(1, n);
int ans = dist[n];
for (int i = 1; i < k; ++i)
ans = min(ans, dist[get_node_id(n, i)]);
cout << (ans == INF ? -1 : ans) << endl;
return 0;
}