【USACO 2008 January Silver】架设电话线 二分答案+最短路

博客介绍了如何利用二分法解决USACO竞赛中的一道题目,该题目涉及在有限免费边的情况下寻找满足条件的最短路径。通过将边权大于二分值的边视为1,小于的视为0,转化成最短路问题进行求解。代码展示了具体实现过程。
摘要由CSDN通过智能技术生成
这道题其实跟以前做的求所有到终点的路径的最大边的最小值很像,那个问题是用二分来解的,而这道题,无非是增加了一个k条边免费的一个限制。依旧可以使用二分答案的方法解决,在判定是否可行时,只需要判断是否能寻找到一条路径,使得该路径上大于我们二分的这个值的边不超过k条,实质上就是最短路做的一个变形而已,小于二分的值的边可以看做边权为0,大于的可以看做边权为1,直接求最短路看是否小于k即可
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
#define MAX 1009
#define inf 1011111111

using namespace std;

int n,i,m,k;

struct wbysr
{
	int to,value;
};
vector<wbysr>e[MAX];

bool check(int x)
{
	queue<int>q;
	int done[MAX]={0},dis[MAX];
	for(int i=2;i<=n;i++)
		dis[i]=inf;
	dis[1]=0;
	done[1]=1;
	q.push(1);
	while(!q.empty())
	{
		int now=q.front();
		q.pop();
		done[now]=0;
		for(int j=0;j<e[now].size();j++)
		{
			if(dis[e[now][j].to]>dis[now]+bool(e[now]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值