二分答案

  hihocoder上的题目,之前codeforces又一次也用到过这种方法,直接对答案进行二分,并且根据题意验证。当对一道题目毫无头绪的时候,可以试试这种神奇的方法。

#include <iostream>
#include <algorithm>
#include <queue>
#include <cstdio>
#include <cstring>
using namespace std;
int n,m,k,t,size=0;
int vis[10010]={false};
struct EDGE{
	int v,w;
	struct EDGE* next;
}e[2000010];
struct EDGE* p[10010]={NULL};
void addedge(int a,int b,int value)
{
	e[size].next=p[a];
	p[a]=&e[size];
	e[size].v=b;e[size].w=value;
	size++;
}
bool f(int x)
{
	memset(vis,0,sizeof(vis));
	queue<int> h;
	h.push(1);
	while(!h.empty()){
		int a=h.front();h.pop();
		if(a==t) return true;
		if(vis[a]==k) continue;
		for(struct EDGE* u=p[a];u;u=u->next){
			int v=u->v;
			if(vis[v]||u->w>x) continue;
			vis[v]=vis[a]+1;
			h.push(v);
		}
	}
	return false;
}
int main()
{
	//freopen("in.txt","r",stdin);
	int temp=0;
	cin>>n>>m>>k>>t;
	for(int i=0;i<m;i++){
		int a,b,w;
		scanf("%d%d%d",&a,&b,&w);
		addedge(a,b,w);addedge(b,a,w);
		temp=max(temp,w);
	}
	int l=0,h=temp,mid;
	while(l<h){
		mid=(l+h)>>1;
		if(f(mid)) h=mid;
		else l=mid+1;
	}
	cout<<l<<endl;
	return 0;
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二分查找二分答案是两个不同的概念。 二分查找(Binary Search)是一种常用的查找算法,适用于有序的数组或列表。它通过将目标值与数组中间元素进行比较,从而确定目标值在数组的左半部分还是右半部分,然后再在相应的半部分中继续查找,直到找到目标值或者确定目标值不存在。二分查找的时间复杂度是 O(logn)。 以下是一个简单的 C++ 实现示例: ```cpp int binarySearch(int arr[], int target, int left, int right) { while (left <= right) { int mid = left + (right - left) / 2; if (arr[mid] == target) return mid; else if (arr[mid] < target) left = mid + 1; else right = mid - 1; } return -1; // 目标值不存在 } ``` 二分答案(Binary Search for Answer)是一种在某个范围内寻找满足某个条件的最优解的方法。它通过在一个给定范围内进行二分搜索,每次确定一个中间值,然后判断该中间值是否满足条件。如果满足条件,则将搜索范围缩小到左半部分;如果不满足条件,则将搜索范围缩小到右半部分。通过不断缩小搜索范围,最终找到满足条件的最优解。 这种方法在一些问题中很常见,比如在一个有序数组中找到满足某个条件的最小/最大值,或者确定一个函数的最大/最小值等。 具体的实现方式会根据具体的问题而有所不同,但基本的思路是相似的。你可以根据具体的问题来实现相应的二分答案算法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值