You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

68 lines
2.4 KiB

2 years ago
#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> PII;
const int INF = 0x3f3f3f3f;
const int N = 1010; // 1000个点
const int M = 20010; // 10000条记录无向边需要两倍空间
int idx, h[N], e[M], w[M], ne[M];
void add(int a, int b, int c) {
e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx++;
}
int n; //点数
int m; //边数
bool st[N]; //记录是不是在队列中
int k; //不超过K条电缆由电话公司免费提供升级服务
int dist[N]; //记录最短距离
// u指的是我们现在选最小花费
bool check(int x) {
memset(st, false, sizeof st);
memset(dist, 0x3f, sizeof dist);
priority_queue<PII, vector<PII>, greater<PII>> q;
dist[1] = 0;
q.push({0, 1});
while (q.size()) {
PII t = q.top();
q.pop();
int d = t.first, u = t.second;
if (st[u]) continue;
st[u] = true;
for (int i = h[u]; ~i; i = ne[i]) {
int j = e[i], v = w[i] > x; //如果有边比我们现在选的这条边大那么这条边对方案的贡献为1反之为0
if (dist[j] > d + v) {
dist[j] = d + v;
q.push({dist[j], j});
}
}
}
//如果按上面的方法计算后n结点没有被松弛操作修改距离则表示n不可达
if (dist[n] == INF) {
puts("-1"); //不可达,直接输出-1
exit(0);
}
return dist[n] <= k; //如果有k+1条边比我们现在这条边大那么这个升级方案就是不合法的反之就合法
}
int main() {
memset(h, -1, sizeof h);
cin >> n >> m >> k;
int a, b, c;
for (int i = 0; i < m; i++) {
cin >> a >> b >> c;
add(a, b, c), add(b, a, c);
}
/*这里二分的是直接面对答案设问:最少花费
k+1
k+1(k+1),0
1e6
0 ~ 1e6*/
int l = 0, r = 1e6;
while (l < r) {
int mid = (l + r) >> 1;
if (check(mid)) // check函数的意义如果当前花费可以满足要求那么尝试更小的花费
r = mid;
else
l = mid + 1;
}
printf("%d\n", l);
return 0;
}