P5304旅行者(比bk201还要流氓的解法)

题目如上。
暴力碾标算,n^2过百万!!
作为一道黑题它确实有点点水(如果是畜生解法的话)
就是找出两两点之间的最短路的最小值。
本来是很高深的一题,要跑两遍最短路啊,然后染色啊,再拓展什么的,但是!有一个大仙(不是bk201)暴力了一发。
解法:
考虑一个叫做dijkstra的算法(这里千万不能spfa),它是怎么跑的呢?
很简单,贪心找当前最短路,然后在利用下一个节点拓展下下一个节点。
然鹅,这个过程如果跑全图的话,会炸到M78星云去!!!
但是,由于奇妙的dijkstra的贪心正确性,我们拓展到的第一个节点就是当前最小值,于是,我们
退!出!
大爷我不跑了!
这波操作真的是非常神仙了!!!
通过这个可爱的return,我们省去了大量的时间和空间,有许多的点可以不用跑了!
(本质就是一个n^2暴力。。。)
神奇的是,这个dij的复杂度应该是和点数,标记点数反相关的,如果n-k的值越小,dij的速度越快,当然,如果n-k=0,那么这个dij基本就是线性,不,是O(1),甚至可以用一次扫描出边比最小值代替!
所以,它是一个伪n^2的算法。
(然后还是跟着zrx大佬学习了一种新的dijk打法。)
代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=1e6+;
ll n,m,k;
struct edge
{
ll to,next,dis;
}e[maxn];
ll cnt,head[maxn];
inline void addedge(ll from,ll to,ll dis)
{
e[++cnt].next=head[from];
e[cnt].to=to;
e[cnt].dis=dis;
head[from]=cnt;
}
struct node//手动堆优化
{
ll x;
ll v;
bool operator <(const node &an)const
{
return v>an.v;
}
};
ll dis[maxn];
bitset < maxn > vis,fl;
ll dijkstra(int s)
{
priority_queue < node > q;
vis.reset();
memset(dis,0x3f,sizeof(dis));
q.push((node){s,});
dis[s]=;
while(!q.empty())
{
node s1=q.top();
q.pop();
ll u=s1.x;
if(fl[u]!=&&u!=s)//第一个非起点标记点
return dis[u];//直接返回最小距离
if(vis[u]==)//继续dij
{
vis[u]=;
for(ll i=head[u];i;i=e[i].next)
{
int v=e[i].to;
if(dis[v]>dis[u]+e[i].dis)
{
dis[v]=dis[u]+e[i].dis;
q.push((node){v,dis[v]});
}
}
}
}
return 0x3f3f3f3f3f3f3f3f;
}
int main()
{
int T;
cin>>T;
while(T--)
{
cnt=;
memset(head,,sizeof(head));
fl.reset();
scanf("%lld%lld%lld",&n,&m,&k);
for(ll i=;i<=m;i++)
{
ll x,y,z;
scanf("%lld%lld%lld",&x,&y,&z);
addedge(x,y,z);
}
for(ll i=;i<=k;i++)
{
ll x;
scanf("%lld",&x);
fl[x]=;
}
ll ans=0x3f3f3f3f3f3f3f3f;
for(ll i=;i<=n;i++)
{
if(fl[i]!=)//每个标记点都跑一遍
ans=min(dijkstra(i),ans);
}
printf("%lld\n",ans);
}
return ;
}
下行有惊喜哦
膜拜下面这位大佬,有时间可以去他的博客水一水。
https://www.cnblogs.com/2529102757ab/
(完)
P5304旅行者(比bk201还要流氓的解法)的更多相关文章
- 洛谷 P 5 3 0 4 [GXOI/GZOI2019]旅行者
题目描述 J 国有 n 座城市,这些城市之间通过 m 条单向道路相连,已知每条道路的长度. 一次,居住在 J 国的 Rainbow 邀请 Vani 来作客.不过,作为一名资深的旅行者,Vani 只对 ...
- [转] POJ图论入门
最短路问题此类问题类型不多,变形较少 POJ 2449 Remmarguts' Date(中等)http://acm.pku.edu.cn/JudgeOnline/problem?id=2449题意: ...
- 【C#实现漫画算法系列】-判断 2 的乘方
微信上关注了算法爱好者这个公众号,有一个漫画算法系列的文章生动形象,感觉特别好,给大家推荐一下(没收过广告费哦),原文链接:漫画算法系列.也看到了许多同学用不同的语言来实现算法,作为一枚C#资深爱好的 ...
- 图论常用算法之一 POJ图论题集【转载】
POJ图论分类[转] 一个很不错的图论分类,非常感谢原版的作者!!!在这里分享给大家,爱好图论的ACMer不寂寞了... (很抱歉没有找到此题集整理的原创作者,感谢知情的朋友给个原创链接) POJ:h ...
- oracle习题集-高级查询2
1.列出员工表中每个部门的员工数和部门编号 Select deptno,count(*) from emp group by deptno; 2.列出员工表中,员工人数大于3的部门编号和员工人数 ; ...
- P5304 [GXOI/GZOI2019]旅行者
题目地址:P5304 [GXOI/GZOI2019]旅行者 这里是官方题解 一个图 \(n\) 点 \(m\) 条边,里面有 \(k\) 个特殊点,问这 \(k\) 个点之间两两最短路的最小值是多少? ...
- 洛谷 P5304 [GXOI/GZOI2019]旅行者(最短路)
洛谷:传送门 bzoj:传送门 参考资料: [1]:https://xht37.blog.luogu.org/p5304-gxoigzoi2019-lv-xing-zhe [2]:http://www ...
- luogu P5304 [GXOI/GZOI2019]旅行者
传送门 所以这个\(5s\)是SMG 暴力是枚举每一个点跑最短路,然后有一个很拿衣服幼稚的想法,就是把所有给出的关键点当出发点,都丢到队列里,求最短路的时候如果当前点\(x\)某个相邻的点\(y\)是 ...
- P5304 [GXOI/GZOI2019]旅行者(最短路/乱搞)
luogu bzoj Orz自己想出神仙正解的sxy 描述略 直接把所有起点推进去跑dijkstra... 并且染色,就是记录到这个点的最短路是由哪个起点引导出来的 然后再把所有边反指跑一次... 之 ...
随机推荐
- 从一道ctf看php反序列化漏洞的应用场景
目录 0x00 first 前几天joomla爆出个反序列化漏洞,原因是因为对序列化后的字符进行过滤,导致用户可控字符溢出,从而控制序列化内容,配合对象注入导致RCE.刚好今天刷CTF题时遇到了一个类 ...
- 编译 lame for iOS
网上找了许多编译lame的教程,结果都是编译失败,多次尝试后发现是编译脚本放错路径了,记录下编译的过程,把编译脚本放到源码文件夹中和修改编译脚本中的目录是关键: 一.首先去Lame官网 http:// ...
- C++简单程序设计
计算机的最基本功能是数据处理 l C++支持的基本数据类型: n 整数.实数.字符.布尔数据 l C++支持的基本运算 n 算术运算.关系运算.逻辑运算.位运算.逗号运算.条件运算 程序要能够 ...
- vue中百度地图API的调用
1.使用百度地图api需要使用jsonp,来获取百度api的返回,因为vue不自带jsonp所以需要下载 安装jsonp npm i vue-jsonp -S 引入jsop import Vue fr ...
- .NET Core使用App.Metrics监控消息队列(一):初探
一.简介 App Metrics是一个开放源代码和跨平台的.NET库,用于记录应用程序中的指标.App Metrics可以在.NET Core或也支持.NET 4.5.2的完整.NET框架上运行. A ...
- 基于华为物联网IOT的应用开发 --- 基于.net 的SDK封装
最近,物联网的概念比较热门,一大批厂商抢着占领物联网的高低,包括有华为物联网.阿里云物联网.腾讯物联网.AWS物联网等等,无法一一列举,一般物联网包含设备侧开发.平台侧开发.应用侧开发,三个部分构成了 ...
- opencv::轮廓发现(find contour in your image)
轮廓发现(find contour) 轮廓发现是基于图像边缘提取的基础寻找对象轮廓的方法. 所以边缘提取的阈值选定会影响最终轮廓发现结果 //发现轮廓 cv::findContours( InputO ...
- 05jmeter-responses中有多组json数据,提取同一条json数据的两个字段
某接口返回结果如上图,取id和groupNo 1.读取确定的某条json数据:如取第一条,一个JSON Extractor即可实现 2.随机读取某条json数据: 需要两个JSON Extractor ...
- vmware14安装centos7的步骤(图文详解)
一.centos的安装 centos分为桌面版和黑屏版(命令行版):在这里我使用的是命令行版. 这里选择安装程序光盘映像文件,文件就是centos7的iso文件. 虚拟机的名称和位置自行设置; 虚拟机 ...
- 基于STM32F103和Cube的输入捕获例程
1.开发环境 (1)Cube5.24 (2)Keil5 (3)STM32F103 2.Cube配置 Cube配置很简单,只要打开TIM4通道1的引脚,设置为输入捕获模式,在配置是高或低电平沿触发 TI ...