「USACO08JAN」电话线Telephone Lines 解题报告
题面
大意:在加权无向图上求出一条从 \(1\) 号结点到 \(N\) 号结点的路径,使路径上第 \(K + 1\) 大的边权尽量小。
思路:
由于我们只能直接求最短路,不能记录过程中的具体的边——那样会特别麻烦
所以,我们就尝试着去想更优的办法
题目中所说,能够免去 \(K\) 条边的费用,那么对于要建设的边中,肯定免去费用最大 $K $ 条边更优
我们关注的应该是第 \(K+1\) 大边的边权,因为其他边权大于这条边边权的边都会被略去
这条边可以枚举吗?
似乎不行,枚举的复杂度还要在最短路的基础上,乘上一个 \(M\) ,不就TLE(Time Limit Enough)了吗……
那么——对于这个边的边权,能不能二分呢?
首先,二分需要满足单调性
题目中,这条第 \(K+1\) 大的边边权越小,能够满足的情况越少,反之亦然
因此我们可以使用二分的方法来查找答案
怎么判断满足或不满足
对于边权大于 \(mid\) 的边,我们改变它的边权为1,否则为0,然后再跑最短路,这样得出来的结果应该是从 \(1\) 号结点到 $N $ 号结点至少要有几条大于 \(mid\) 的边,然后与 \(K\) 比较,小于 \(K\) 则满足,否则不满足
Code:
#include<bits/stdc++.h>
#define INF 0x7f7f7f7f
#define M 10010
#define N 1010
using namespace std;
struct node{
int to,cost;
int nxt;
node(int a,int b):to(a),cost(b){ }
node(){ }
}b[M<<1];
int head[N],d[N],vis[N];
int n,m,res,t,ans=INF;//初值一样要为INF
int read()
{
int s=0;
char c=getchar();
while(!isdigit(c))
c=getchar();
while(isdigit(c))
{
s=(s<<1)+(s<<3)+c-'0';
c=getchar();
}
return s;
}
void add(int x,int y,int cost)//建边,正反一起
{
b[++t]=node(y,cost);
b[t].nxt=head[x];
head[x]=t;
b[++t]=node(x,cost);
b[t].nxt=head[y];
head[y]=t;
return;
}
bool BFS(int k)//好吧,这里不算严格的最短路,因为边权变成了0和1,可以直接宽搜搞定,但是下面的程序,
{//明明是一个真SPFA,假宽搜
int i,to,cur,cost;
for(i=1;i<=n;i++)
{
d[i]=INF;
vis[i]=0;
}
queue<int>p;
p.push(1);
vis[1]=1;
d[1]=0;
while(!p.empty())
{
cur=p.front();p.pop();
vis[cur]=0;
for(i=head[cur];i;i=b[i].nxt)
{
to=b[i].to;
cost=d[cur]+(b[i].cost>k);//处理边权
if(cost<d[to])
{
d[to]=cost;
if(!vis[to])
{
vis[to]=1;
p.push(to);
}
}
}
}
if(d[n]<=res)//判断
return 1;
return 0;
}
int main()
{
int i;
int x,y,cost;
int l,r,mid;
n=read();m=read();res=read();
l=r=0;
for(i=1;i<=m;i++)
{
x=read();y=read();cost=read();
add(x,y,cost);//建边,注意是双向的
r=max(r,cost);//r的上限,可以自己赋为1e6,这是题目中给的最大值
}
while(l<=r)
{
mid=(l+r)>>1;
if(BFS(mid))//判断
{
ans=mid;
r=mid-1;
}
else
l=mid+1;
}
if(ans==INF)//初值应该为INF,不能为0,因为有可能电信公司比较大方,免费之类的——给我多好
ans=-1;
printf("%d",ans);
return 0;
}
另外提供一个比较high的评测
在洛谷过了,这里不一定过哦!
「USACO08JAN」电话线Telephone Lines 解题报告的更多相关文章
- 「USACO08JAN」电话线Telephone Lines
传送门 Luogu 解题思路 考虑二分,每次把大于二分值的边的权设为1,小于等于的设为0,如果最短路<=k则可行,记得判无解 细节注意事项 咕咕咕 参考代码 #include <algor ...
- 洛谷 P4714 「数学」约数个数和 解题报告
P4714 「数学」约数个数和 题意(假):每个数向自己的约数连边,给出\(n,k(\le 10^{18})\),询问\(n\)的约数形成的图中以\(n\)为起点长为\(k\)的链有多少条(注意每个点 ...
- 「NOI2013」树的计数 解题报告
「NOI2013」树的计数 这什么神题 考虑对bfs重新编号为1,2,3...n,然后重新搞一下dfs序 设dfs序为\(dfn_i\),dfs序第\(i\)位对应的节点为\(pos_i\) 一个暴力 ...
- 「NOI2016」优秀的拆分 解题报告
「NOI2016」优秀的拆分 这不是个SAM题,只是个LCP题目 95分的Hash很简单,枚举每个点为开头和末尾的AA串个数,然后乘一下之类的. 考虑怎么快速求"每个点为开头和末尾的AA串个 ...
- 「NOI2016」循环之美 解题报告
「NOI2016」循环之美 对于小数\(\frac{a}{b}\),如果它在\(k\)进制下被统计,需要满足要求并且不重复. 不重复我们确保这个分数是最简分数即\((a,b)=1\) 满足要求需要满足 ...
- 「FJOI2018」领导集团问题 解题报告
「FJOI2018」领导集团问题 题意:给你一颗\(n\)个点的带点权有根树,选择一个点集\(S\),使得点集中所有祖先的点权$\le \(子孙的点权,最大化\)|S|$(出题人语死早...) 一个显 ...
- 「SP25784」BUBBLESORT - Bubble Sort 解题报告
SP25784 BUBBLESORT - Bubble Sort 题目描述 One of the simplest sorting algorithms, the Bubble Sort, can b ...
- 「SP122」STEVE - Voracious Steve 解题报告
SP122 STEVE - Voracious Steve 题意翻译 Problem Steve和他的一个朋友在玩游戏,游戏开始前,盒子里有 n个甜甜圈,两个人轮流从盒子里抓甜甜圈,每次至少抓 1个, ...
- 「Luogu」[JSOI2007]字符加密 解题报告
题面 思路: 作为一个后缀数组的初学者,当然首先想到的是后缀数组 把\(s\)这个串首尾相接,扩展为原来的两倍,就能按后缀数组的方法处理 证明: 神仙一眼就看出这是后缀的裸题,我这个蒟蒻想了半天想不出 ...
随机推荐
- 【hiho一下 第147周】小Hi的烦恼
[题目链接]:http://hihocoder.com/contest/hiho147/problem/1 [题意] [题解] bitset的应用; 设better[j][i]表示第j个科目排名为1. ...
- day6_python之pickle、shelve序列化和反序列化
pickle.shelve,python私有,支持所有python数据类型 一.pickle dic={'name':'egon','age':18} print(pickle.dumps(dic)) ...
- [转]分布式session的几种实现方式
我们应当对产生的Session进行处理,通过粘性Session,Session复制或Session共享等方式保证用户的体验度. 以下我将说明5种Session处理策略,并分析其优劣性. 第一种:粘性s ...
- python模块之模块导入
模块的导入 """ 模块的导入使用:模块导入一般都要放在代码的最上面 不同模块的导入顺序: 1 内置模块 2 扩展模块 3 自定义模块 """ ...
- CSS 伸缩布局
转载于:https://blog.csdn.net/weixin_41342585/article/details/80140513 1. flex-direction:设置伸缩容器中成员的排列方式 ...
- 【React】富文本编辑器 清空文本内容 获取HTML
富文本编辑器 React 传入 import React,{Component } from 'react'; import { Card, Button, Table, Form, Select ...
- java 静态导入(1.5特性,好处是不用写类名)
import语句可以导入一个类或某个包中的所有类 import static语句导入一个类中的某个静态方法或所有静态方法 语法举例: import static java.lang.Math.sin; ...
- 学习vue就是那么简单,一个简单的案例
vue是前端兴起的一个javascript库,相信大家都使用过jQuery,虽然vue和jQuery没有可比性,但从熟悉的角度去理解新的东西或许会容易接受一些,有时候由于思想和模式的转变会带来阵痛,但 ...
- P1016 高精度除法
题目描述 给你两个很大的正整数A和B,你需要计算A除以B的商和余数. 输入格式 输入一行包含两个正整数A和B,以一个空格分隔(A和B的位数都不超过 \(10^5\)) 输出格式 输出一行包含两个整数, ...
- chrome查看当前网页cookie内容
按下F12,打开开发者工具 然后点开Application,在点击cookie左侧的小三角,选择网页,就可以看见对应的cookies了