沉迷于刷水

以前的那个二分写法过不了QAQ 换了一种好像大家都比较常用的二分。原因还不是很清楚。

【题目大意】

给出一张图,可以将其中k条边的边权减为0,求1到n的路径中最长边的最小值。

【思路】

二分答案,即最长边的最小值x。对于每次check(x),我们将边权大于x的边设为1,边权小于等于x的边设为0,跑SPFA,结果相当于最少经过多少条边权大于x的边。如果SPFA结果>k,则不可行,否则可行。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
using namespace std;
const int INF=+;
const int MAXN=+;
struct edge
{
int to,dis;
};
vector<edge> E[MAXN];
int n,p,k;
int inque[MAXN],dis[MAXN]; void addedge(int u,int v,int w)
{
E[u].push_back((edge){v,w});
E[v].push_back((edge){u,w});
} void init()
{
scanf("%d%d%d",&n,&p,&k);
for (int i=;i<=p;i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
addedge(u,v,w);
}
} int check(int x)
{
queue<int> que;
memset(inque,,sizeof(inque));
memset(dis,0x7f,sizeof(dis));
dis[]=,inque[]=;
que.push();
while (!que.empty())
{
int head=que.front();que.pop();
inque[head]=;
for (int i=;i<E[head].size();i++)
{
int nowlen,to=E[head][i].to;
if (E[head][i].dis>x) nowlen=;else nowlen=;
if (dis[head]+nowlen<dis[to])
{
dis[to]=dis[head]+nowlen;
if (!inque[to])
{
que.push(to);
inque[to]=;
}
}
}
}
if (dis[n]>k) return ;else return ;
} void solve()
{
int lb=,ub=INF,ans=-;
while (lb<=ub)
{
int mid=(lb+ub)>>;
if (check(mid)) ub=mid-,ans=mid;
else lb=mid+;
}
printf("%d\n",ans);
} int main()
{
init();
solve();
return ;
}

【SPFA+二分答案】BZOJ1614- [Usaco2007 Jan]Telephone Lines架设电话线的更多相关文章

  1. BZOJ1614: [Usaco2007 Jan]Telephone Lines架设电话线

    1614: [Usaco2007 Jan]Telephone Lines架设电话线 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 892  Solved: ...

  2. 【二分答案】【最短路】bzoj1614 [Usaco2007 Jan]Telephone Lines架设电话线

    对于二分出的答案x而言,验证答案等价于将所有边权>x的边赋成1,否则赋成0,然后判断从1到n的最短路是否<=K. #include<cstdio> #include<cs ...

  3. [Usaco2007 Jan]Telephone Lines架设电话线(最短路,二分)

    [Usaco2007 Jan]Telephone Lines架设电话线 Description FarmerJohn打算将电话线引到自己的农场,但电信公司并不打算为他提供免费服务.于是,FJ必须为此向 ...

  4. BZOJ 1614: [Usaco2007 Jan]Telephone Lines架设电话线

    题目 1614: [Usaco2007 Jan]Telephone Lines架设电话线 Time Limit: 5 Sec  Memory Limit: 64 MB Description Farm ...

  5. 【bzoj1614】[Usaco2007 Jan]Telephone Lines架设电话线 二分+SPFA

    题目描述 Farmer John打算将电话线引到自己的农场,但电信公司并不打算为他提供免费服务.于是,FJ必须为此向电信公司支付一定的费用. FJ的农场周围分布着N(1 <= N <= 1 ...

  6. bzoj 1614: [Usaco2007 Jan]Telephone Lines架设电话线【二分+spfa】

    二分答案,然后把边权大于二分值的的边赋值为1,其他边赋值为0,然后跑spfa最短路看是否满足小于等于k条边在最短路上 #include<iostream> #include<cstd ...

  7. [Usaco2007 Jan]Telephone Lines架设电话线

    题目描述 FarmerJohn打算将电话线引到自己的农场,但电信公司并不打算为他提供免费服务.于是,FJ必须为此向电信公司支付一定的费用.FJ的农场周围分布着N(1<=N<=1,000)根 ...

  8. BZOJ 1614 [Usaco2007 Jan]Telephone Lines架设电话线:spfa + 二分【路径中最大边长最小】

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1614 题意: 给你一个无向图,n个点,m条边. 你需要找出一条从1到n的路径,使得这条路径 ...

  9. [Usaco2007 Jan]Telephone Lines架设电话线[二分答案+最短路思想]

    Description Farmer John打算将电话线引到自己的农场,但电信公司并不打算为他提供免费服务.于是,FJ必须为此向电信公司支付一定的费用. FJ的农场周围分布着N(1 <= N ...

随机推荐

  1. placeholder样式设置

    在input框中有时想将输入的字和placeholder设为不同的颜色或其它效果,这时就可以用以下代码来对placeholder进行样式设置了. ::-webkit-input-placeholder ...

  2. JAVA 企业培训

  3. 如何关闭sublime更新提示

    前提:sublime已激活

  4. 35、def func(a,b=[]) 这种写法有什么坑?

    那我们先通过程序看看这个函数有什么坑吧! def func(a,b=[]): b.append(a) print(b) func(1) func(1) func(1) func(1) 看下结果 [1] ...

  5. Solaris 系统命令使用说明

    1. 查看进程  --  pgreproot@UA4300D-spa:~# pgrep fmd133095root@UA4300D-spa:~# pgrep -l fmd133095 fmdroot@ ...

  6. 蓝色的PC端后台管理界面设计模板——后台

    链接:http://pan.baidu.com/s/1o82hXX4 密码:x6le

  7. python 并发爬虫的快感

    import time from tomorrow import threads from requests_html import HTMLSession session=HTMLSession() ...

  8. 008 BlockingQueue理解

    原文https://www.cnblogs.com/WangHaiMing/p/8798709.html 本篇将详细介绍BlockingQueue,以下是涉及的主要内容: BlockingQueue的 ...

  9. $NTT$(快速数论变换)

    - 概念引入 - 阶 对于$p \in N_+$且$(a, \ p) = 1$,满足$a^r \equiv 1 (mod \ p)$的最小的非负$r$为$a$模$p$意义下的阶,记作$\delta_p ...

  10. WPF拖动DataGrid滚动条时内容混乱的解决方法

    WPF拖动DataGrid滚动条时内容混乱的解决方法 在WPF中,如果DataGrid里使用了模板列,当拖动滚动条时,往往会出现列表内容显示混乱的情况.解决方法就是在Binding的时候给Update ...