CFGym 101490E 题解
一、题目链接
http://codeforces.com/gym/101490
二、题面
  

三、题意
给你一个图,n个点,m条边,一个x,从顶点1走到顶点n。假设从顶点1走到顶点n的最短路为d,x代表你可以选择的路径的长度范围:[d, d * (1 + x%)]。让你求出在所有长度在此区间内的路径,路径上最大的边的最小值。如图所示:

从顶点1到顶点9的最短距离为16。所以,可选的路径范围是:[16, 18.4]。可以发现,1->4->7->8->9这条路径的长度为18,是在此区间内的,而且这条路径上的边最大值为5。而另一条有效路径是1->9,边最大值是16。所以,答案是5。
四、思路
先跑一遍最短路算法,得到从顶点1到顶点n的最短路径。然后,二分最大边权,把大于枚举值mid的边全部删掉,再跑最短路,如果从1到n的最短路在[d, d * (1 + x%)]范围内,说明枚举的mid是有效的。最后输出枚举的最小的最大值即可。
删边怎么删呢?千万别用set或者vector之类的容器去模拟删除,这样复杂度会大很多。快速的方法是:使用两个图,一个是原图,另一个是二分最大边权的图,每次枚举一个mid时,都用原图来筛选,把大于mid的边直接过滤掉就OK了。
为什么这样是正确的呢?因为答案是满足单调性的。(现在我只能这么写。有些感觉上的东西实在是表达不出来呀。)
五、源代码
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int, LL> PLL;//first:邻接点,second:和邻接点之间的边权。
;
vector<PLL> g[][MAXN];
int n, m, x;
double minl, maxl;
typedef pair<LL, int> P;//跑dijstra算法必备的。
LL d[MAXN];
LL djst(int s, int which) {
    priority_queue<P, vector<P>, greater<P> > que;
    memset(d, 0x3f, sizeof(d));
    d[s] = ;
    que.push(P(, s));
    while(!que.empty()) {
        P p = que.top();
        que.pop();
        int v = p.second;
        if(d[v] < p.first)continue;
        , sz = g[which][v].size(); i < sz; ++i) {
            PLL pll = g[which][v][i];
            if(d[pll.first] > d[v] + pll.second) {
                d[pll.first] = d[v] + pll.second;
                que.push(P(d[pll.first], pll.first));
            }
        }
    }
    return d[n];
}
bool test(LL mid){
    ;i < MAXN;++i)g[][i].clear();
    ;i <= n;++i){
        , sz = g[][i].size();j < sz;++j){
            PLL pll = g[][i][j];
            ][i].push_back(pll);
        }
    }
    LL dis = djst(, );
    double ddis = (double)dis;
    if(ddis > minl && ddis < maxl)return true;
     || fabs(ddis - maxl) < 1e-)return true;
    return false;
}
int main() {
#ifndef ONLINE_JUDGE
    freopen("Einput.txt", "r", stdin);
#endif // ONLINE_JUDGE
    int a, b;
    LL c;
    while(~scanf("%d%d%d", &n, &m, &x)) {
        ; i < MAXN; ++i)g[][i].clear();
        ; i <= m; ++i) {
            scanf("%d%d%lld", &a, &b, &c);
            g[][a].push_back(make_pair(b, c));
            g[][b].push_back(make_pair(a, c));
        }
        minl = (, );
        maxl = minl * (1.0 + x * 1.0 / 100.0);
        LL low = -, high = 1LL << , mid;
        ){
            mid = (low + high) / ;
            if(test(mid))high = mid;
            else low = mid;
        }
        printf("%lld\n", high);
    }
    ;
}
经验:long long类型的数值做数组下标也是没问题的。这样,在需要使用long long数据类型的题目中,通通使用long long数据类型,包括for循环,这样可以省去各种麻烦的类型转换操作。尤其是使用C/C++语言,编译器没有自动类型转换的情况下。
CFGym 101490E 题解的更多相关文章
- CFGym 101490J 题解
		
一.题目链接 http://codeforces.com/gym/101490 二.题面 三.题意 给你n个点,代表学生所在位置,n个点,代表老师所在位置.每个学生分配一个老师.让你找出一个最小的学生 ...
 - CFGym 101161I 题解
		
一.题目链接 http://codeforces.com/gym/101161/problem/I 二.题意 给定一棵树,一个初始的省会城市,若干个询问,0表示修改省会城市,1表示查询去省会必须经过指 ...
 - CFGym 100198G 题解
		
一.题目链接 http://codeforces.com/gym/100198/problem/G 二.题意 看样例就能明白,写表达式解析器. 三 .思路 一看这题目,立马就会想到“后缀表达式”,考虑 ...
 - CFGym 101194L 题解
		
一.题目链接 http://codeforces.com/gym/101194/problem/L 二.题意 有4个队伍,要打6场比赛(刚好每两个队伍都能相互比一次),若A和B比赛有3种结果: A赢B ...
 - CFGym 101194D 题解
		
一.题目链接 http://codeforces.com/gym/101194/problem/D 二.题意 给定一个数字n和一个数字k,一个n个整数的序列,让你在里面找尽可能多的长度为k的符合“要求 ...
 - CFGym 101505I 题解
		
一.题目链接 http://codeforces.com/gym/101505 二.题意 这题其实主要就是题意,理解题意后,就是水题了.我想了下,主要原因就是这几点: 1.题意太过英文化,很多句子不能 ...
 - CFGym 100211J 题解
		
一.题目 二.题意 给定一个字母表(最多也就是英文小写字母的前10个字母),一个交换表,两个字符串,判断字符串A能否通过交换表的交换方式变成字符串B. 三.思路 1.一开始,比赛时,我半模拟半记忆化地 ...
 - [CF-GYM]Abu Tahun Mod problem题解
		
前言 这道题比较简单,但我还是想了好一会 题意简述 Abu Tahun很喜欢回文. 一个数组若是回文的,那么它从前往后读和从后往前读都是一样的,比如数组\(\left\{1\right\},\left ...
 - 2016 华南师大ACM校赛 SCNUCPC 非官方题解
		
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
 
随机推荐
- Solidity 官方文档中文版 4_Solidity 编程实例
			
Voting 投票 接下来的合约非常复杂,但展示了很多Solidity的特性.它实现了一个投票合约.当然,电子选举的主要问题是如何赋予投票权给准确的人,并防止操纵.我们不能解决所有的问题,但至少我们会 ...
 - java学习之浅谈多线程4--SwingWorker
			
GUI事件处理和绘图代码在一个被称为事件分发线程的特殊线程中执行.如果一个事件需要很长的时间处理,线程就不能顾及到队列中的其他任务.为了解决这个问题,可以运行费时的任务来处理单独线程中的事件.Swin ...
 - python 清空列表
			
# lst = ["篮球","排球","乒乓球","足球","电子竞技","台球" ...
 - vue 脚手架(一,创建脚手架)
			
本文以转移至本人的个人博客,请多多关注! 本文以转移至本人的个人博客,请多多关注! 本文以转移至本人的个人博客,请多多关注! 本文以转移至本人的个人博客,请多多关注! 经过一段时间对Vue的学习.觉得 ...
 - Java Redis的Pipeline管道,批量操作,节省大量网络往返时间  &  Redis批量读写(hmset&hgetall) 使用Pipeline
			
一般情况下,大家使用redis去put/get都是先拿到一个jedis实例,然后操作,然后释放连接:这种模式是 请求-响应,请求-响应 这种模式,下一次请求必须得等第一次请求响应回来之后才可以,因为r ...
 - bzoj3172: [Tjoi2013]单词 ac自动机
			
某人读论文,一篇论文是由许多单词组成.但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次. Input 第一个一个整数N,表示有多少个单词,接下来N行每行一个单词.每个单词 ...
 - 在请求中使用XML Publisher生成文件报错
			
在页面上使用按钮生成该文件不报错,但是使用请求就报错. 错误内容如下 Error : No corresponding LOB data found :SELECT L.FILE_DATA FILE_ ...
 - 331. Verify Preorder Serialization of a Binary Tree -- 判断是否为合法的先序序列
			
One way to serialize a binary tree is to use pre-order traversal. When we encounter a non-null node, ...
 - 无线基站侧的信令风暴根因——频繁的释放和连接RRC产生大量信令、设备移动导致小区重选信令增加、寻呼信令多
			
全局思维(核心网和无线基站侧都会有信令风暴): LTE网络系统可能出现信令风暴的原因,大致可以总结出以下几点: 1.网络架构的变化,导致4G核心网信令流量较2G/3G大幅增加 a)架构扁平化:LTE网 ...
 - 网络流量预测 国内外研究现状【见评论】——传统的ARIMA、HMM模型,目前LSTM、GRU、CNN应用较多,貌似小波平滑预处理步骤非常关键
			
Time Series Anomaly Detection in Network Traffic: A Use Case for Deep Neural Networks from:https://j ...