1496:【例 3】架设电话线

时间限制: 1000 ms         内存限制: 65536 KB
提交数:1549    通过数: 784

【题目描述】

原题来自:USACO 2008 Jan. Silver

在郊区有 N𝑁 座通信基站,P𝑃 条双向电缆,第 i𝑖 条电缆连接基站 Ai𝐴𝑖​和 Bi𝐵𝑖​​ 。特别地,11 号基站是通信公司的总站,N𝑁 号基站位于一座农场中。现在,农场主希望对通信线路进行升级,其中升级第 i𝑖 条电缆需要花费 Li𝐿𝑖​ 。

电话公司正在举行优惠活动。农场主可以指定一条从 11 号基站到 N𝑁 号基站的路径,并指定路径上不超过 K𝐾 条电缆,由电话公司免费提供升级服务。农场主只需要支付在该路径上剩余的电缆中,升级价格最贵的那条电缆的花费即可。求至少用多少钱能完成升级。

一句话题意:在加权无向图上求出一条从 11 号结点到 N𝑁 号结点的路径,使路径上第 K+1𝐾+1 大的边权尽量小。

【输入】

第一行三个整数 N,P,K𝑁,𝑃,𝐾;

接下来 P𝑃 行,每行三个整数 Ai,Bi,Li𝐴𝑖,𝐵𝑖,𝐿𝑖.

【输出】

若不存在从 11 到 N𝑁 的路径,输出 −1−1。否则输出所需最小费用。

【输入样例】

5 7 1
1 2 5
3 1 4
2 4 8
3 2 3
5 2 9
3 4 7
4 5 6

【输出样例】

4

【提示】

数据范围:

0≤K<N≤1000,1≤P≤2000

code:

#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10, INF = 0x3f3f3f3f;
int head[N], ver[N], nex[N], edge[N], vis[N], dis[N];
typedef pair<int, int> P;
int l = 0, r = 1e6, mid;
int n, m, k, cnt;
void add(int x, int y, int w) {
	ver[++cnt] = y;
	edge[cnt] = w;
	nex[cnt] = head[x];
	head[x] = cnt;
}
void read() {
	int x, y, w;
	scanf("%d%d%d", &n, &m, &k);
	for (int i = 1; i <= m; i++) {
		scanf("%d%d%d", &x, &y, &w);
		add(x, y, w); add(y, x, w);
	}
}
bool check(int x) {
	for (int i = 0; i < N; i++)
		dis[i] = INF, vis[i] = 0;
	priority_queue<P> q;
	q.push(make_pair(0, 1)); dis[1] = 0;
	while (q.size()) {
		int u = q.top().second; q.pop();
		if (vis[u]) continue;
		vis[u] = 1;
		for (int i = head[u]; i; i = nex[i]) {
			int v = ver[i], w = edge[i];
			int nd = dis[u] + (w > x ? 1 : 0);
			if (dis[v] > nd) {
				dis[v] = nd;
				if (!vis[v])
					q.push(make_pair(-dis[v], v));
			}
		}
	}
	return (dis[n] <= k);
}
void solve() {
	while (l <= r) {
		mid = ((r + l) >> 1);
		if (check(mid))
			r = mid - 1;
		else l = mid + 1;
	}
	if (r == 1e6) puts("-1");
	else printf("%d\n", l);
}
int main() {
	read();
	solve();
	return 0;
}

  • 23
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值