题目如上。

暴力碾标算,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还要流氓的解法)的更多相关文章

  1. 洛谷 P 5 3 0 4 [GXOI/GZOI2019]旅行者

    题目描述 J 国有 n 座城市,这些城市之间通过 m 条单向道路相连,已知每条道路的长度. 一次,居住在 J 国的 Rainbow 邀请 Vani 来作客.不过,作为一名资深的旅行者,Vani 只对 ...

  2. [转] POJ图论入门

    最短路问题此类问题类型不多,变形较少 POJ 2449 Remmarguts' Date(中等)http://acm.pku.edu.cn/JudgeOnline/problem?id=2449题意: ...

  3. 【C#实现漫画算法系列】-判断 2 的乘方

    微信上关注了算法爱好者这个公众号,有一个漫画算法系列的文章生动形象,感觉特别好,给大家推荐一下(没收过广告费哦),原文链接:漫画算法系列.也看到了许多同学用不同的语言来实现算法,作为一枚C#资深爱好的 ...

  4. 图论常用算法之一 POJ图论题集【转载】

    POJ图论分类[转] 一个很不错的图论分类,非常感谢原版的作者!!!在这里分享给大家,爱好图论的ACMer不寂寞了... (很抱歉没有找到此题集整理的原创作者,感谢知情的朋友给个原创链接) POJ:h ...

  5. oracle习题集-高级查询2

    1.列出员工表中每个部门的员工数和部门编号 Select deptno,count(*) from emp group by deptno; 2.列出员工表中,员工人数大于3的部门编号和员工人数 ; ...

  6. P5304 [GXOI/GZOI2019]旅行者

    题目地址:P5304 [GXOI/GZOI2019]旅行者 这里是官方题解 一个图 \(n\) 点 \(m\) 条边,里面有 \(k\) 个特殊点,问这 \(k\) 个点之间两两最短路的最小值是多少? ...

  7. 洛谷 P5304 [GXOI/GZOI2019]旅行者(最短路)

    洛谷:传送门 bzoj:传送门 参考资料: [1]:https://xht37.blog.luogu.org/p5304-gxoigzoi2019-lv-xing-zhe [2]:http://www ...

  8. luogu P5304 [GXOI/GZOI2019]旅行者

    传送门 所以这个\(5s\)是SMG 暴力是枚举每一个点跑最短路,然后有一个很拿衣服幼稚的想法,就是把所有给出的关键点当出发点,都丢到队列里,求最短路的时候如果当前点\(x\)某个相邻的点\(y\)是 ...

  9. P5304 [GXOI/GZOI2019]旅行者(最短路/乱搞)

    luogu bzoj Orz自己想出神仙正解的sxy 描述略 直接把所有起点推进去跑dijkstra... 并且染色,就是记录到这个点的最短路是由哪个起点引导出来的 然后再把所有边反指跑一次... 之 ...

随机推荐

  1. 从一道ctf看php反序列化漏洞的应用场景

    目录 0x00 first 前几天joomla爆出个反序列化漏洞,原因是因为对序列化后的字符进行过滤,导致用户可控字符溢出,从而控制序列化内容,配合对象注入导致RCE.刚好今天刷CTF题时遇到了一个类 ...

  2. 编译 lame for iOS

    网上找了许多编译lame的教程,结果都是编译失败,多次尝试后发现是编译脚本放错路径了,记录下编译的过程,把编译脚本放到源码文件夹中和修改编译脚本中的目录是关键: 一.首先去Lame官网 http:// ...

  3. C++简单程序设计

    计算机的最基本功能是数据处理 l  C++支持的基本数据类型: n  整数.实数.字符.布尔数据 l  C++支持的基本运算 n  算术运算.关系运算.逻辑运算.位运算.逗号运算.条件运算 程序要能够 ...

  4. vue中百度地图API的调用

    1.使用百度地图api需要使用jsonp,来获取百度api的返回,因为vue不自带jsonp所以需要下载 安装jsonp npm i vue-jsonp -S 引入jsop import Vue fr ...

  5. .NET Core使用App.Metrics监控消息队列(一):初探

    一.简介 App Metrics是一个开放源代码和跨平台的.NET库,用于记录应用程序中的指标.App Metrics可以在.NET Core或也支持.NET 4.5.2的完整.NET框架上运行. A ...

  6. 基于华为物联网IOT的应用开发 --- 基于.net 的SDK封装

    最近,物联网的概念比较热门,一大批厂商抢着占领物联网的高低,包括有华为物联网.阿里云物联网.腾讯物联网.AWS物联网等等,无法一一列举,一般物联网包含设备侧开发.平台侧开发.应用侧开发,三个部分构成了 ...

  7. opencv::轮廓发现(find contour in your image)

    轮廓发现(find contour) 轮廓发现是基于图像边缘提取的基础寻找对象轮廓的方法. 所以边缘提取的阈值选定会影响最终轮廓发现结果 //发现轮廓 cv::findContours( InputO ...

  8. 05jmeter-responses中有多组json数据,提取同一条json数据的两个字段

    某接口返回结果如上图,取id和groupNo 1.读取确定的某条json数据:如取第一条,一个JSON Extractor即可实现 2.随机读取某条json数据: 需要两个JSON Extractor ...

  9. vmware14安装centos7的步骤(图文详解)

    一.centos的安装 centos分为桌面版和黑屏版(命令行版):在这里我使用的是命令行版. 这里选择安装程序光盘映像文件,文件就是centos7的iso文件. 虚拟机的名称和位置自行设置; 虚拟机 ...

  10. 基于STM32F103和Cube的输入捕获例程

    1.开发环境 (1)Cube5.24 (2)Keil5 (3)STM32F103 2.Cube配置 Cube配置很简单,只要打开TIM4通道1的引脚,设置为输入捕获模式,在配置是高或低电平沿触发 TI ...