二分答案

  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
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值