题目如上。

暴力碾标算,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. 从输入URL到页面渲染完成 -戈多编程

    1.输入URL地址 2.浏览器根据域名查询IP地址 3.浏览器发送HTTP请求到web服务器 4.服务器返回一个永久重定向响应 5.浏览器会跟踪重定向地址 6.服务器处理请求 7.服务器返回一个HTM ...

  2. PhpSpreadsheet 导出特定格式 — 广告请款单

    需求说明 最近需要实现一个导出这种格式的Excel表单,之前都有用过导出Excel的功能,但大都是表头+数据的形式,只用于获取数据,没有太多样式要求,不用合并单元格.合并居中等,也不用对每一行数据特异 ...

  3. Django跨域问题(CORS错误)

    Django跨域问题(CORS错误) 一.出现跨域问题(cors错误)的原因 通常情况下,A网页访问B服务器资源时,不满足以下三个条件其一就是跨域访问 协议不同 端口不同 主机不同 二.Django解 ...

  4. 【EasyCi】持续集成交付,一键式自动化部署系统,开箱即用

    前言 本人是一家互联网公司的java开发,由于公司初期公司未招运维人员,恰好我对linux比较熟悉,便在公司服务器搭建了一套Jenkins.Gitlab.Maven私服.Docker私服.Sonarq ...

  5. python犯傻之题目解答思路比较与反思

    1.题目: 企业发放的奖金根据利润提成.利润(I)低于或等于10万元时,奖金可提10%: 利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%: 20万 ...

  6. JS中的事件委托/事件代理详解

    起因: 1.这是前端面试的经典题型,要去找工作的小伙伴看看还是有帮助的: 2.其实我一直都没弄明白,写这个一是为了备忘,二是给其他的知其然不知其所以然的小伙伴们以参考: 概述: 那什么叫事件委托呢?它 ...

  7. PHP代码审计基础-初级篇

    对于php代码审计我也是从0开始学的,对学习过程进行整理输出沉淀如有不足欢迎提出共勉.对学习能力有较高要求,整个系列主要是在工作中快速精通php代码审计,整个学习周期5天 ,建议花一天时间熟悉php语 ...

  8. ESP8266开发之旅 网络篇⑯ 无线更新——OTA固件更新

    授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...

  9. Leetcode(4)寻找两个有序数组的中位数

    Leetcode(4)寻找两个有序数组的中位数 [题目表述]: 给定两个大小为 m 和 n 的有序数组 nums1 和* nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O( ...

  10. os模块/sys模块/json/pickle模块/logging模块(day16整理)

    目录 今日内容 os模块 对文件操作 对文件夹此操作 辅助性的 了解 sys模块 json和pickle模块 json模块 pickle模块 logging模块 日志级别 添加设置 自定义配置 今日内 ...