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... 并且染色,就是记录到这个点的最短路是由哪个起点引导出来的 然后再把所有边反指跑一次... 之 ...
随机推荐
- Git设置分支保护实现CodeReview卡点
# Git设置分支保护实现CodeReview卡点 > From:https://blog.csdn.net/crisschan/article/details/100922668 > G ...
- HTML5 + WebGL 实现的垃圾分类系统
前言 垃圾分类,一般是指按一定规定或标准将垃圾分类储存.分类投放和分类搬运,从而转变成公共资源的一系列活动的总称.分类的目的是提高垃圾的资源价值和经济价值,力争物尽其用.垃圾在分类储存阶段属于公众的私 ...
- Ubuntu安装Chrome浏览器及解决启动no-sandbox问题
1.安装浏览器 # apt-get install gonme # apt-get update # apt-get install google-chrome-stable 2.启动Chrome浏览 ...
- indexeddb:浏览器中的数据库
随着浏览器功能的不断加强,越来越多的网站开始考虑将大量的数据存储在客户端.这样的考虑是为了直接从本地获取数据,减少从服务器获取数据耗费的网络资源. 原有的浏览器数据存储方案都不适合存储大量数据.Coo ...
- Flask的请求扩展
from flask import Flask,request app = Flask(__name__) 一.请求前 before_request 用法 @app.before_request de ...
- 重大升级!SEER见证人,您的节点需要在10月28日前更新
SEER的区块链底层目前还处于不断完善中.一些新的完善更新会为区块链的基础设施--节点软件添加新的功能.理事会将会就是否接受新的节点版本进行共识投票,如果提案投票通过,将要求所有见证人在指定时间前将节 ...
- ES6入门之let和const命令
前言 大家好,我是一只流浪的kk,当你看到这边博客的时候,说明你已经进入了ES6学习的领域了,从本篇博客开始,我将会将自己学习到ES6的相关知识进行整理,方便大家参考和学习,那么我将带你进入第一节的内 ...
- openssl生成密钥/证书
一.公钥/私钥/签名/验证签名/加密/解密/非对称加密 对称加密:用同一个密码 加密/解密 文件. 非对称加密:加密用的一个密码,解密用另外一组密码. 加密解密:公钥加密数据,然后私钥解密. 公钥 ...
- Java代码优化建议
总结日常Java开发常见优化策略,持续更新. 尽可能使用局部变量 调用方法时传递的参数以及在调用中创建的临时变量都保存在栈中,速度较快,其他变量,如静态变量.实例变量等,都在堆中创建,速度较慢.另外, ...
- java 链接mysql
import java.sql.*; public class ConnectSql { static final String JDBC_DRIVER = "com.mysql.jdbc. ...