Dijkstra【p4943】密室
Description
密室被打开了。
哈利与罗恩进入了密室,他们发现密室由n个小室组成,所有小室编号分别为:1,2,...,n。所有小室之间有m条通道,对任意两个不同小室最多只有一条通道连接,而每通过一条通道都需要Ci 的时间。
开始时哈利与罗恩都在编号为1的小室里,他们的目标是拯救金妮和寻找日记,但是他们发现金妮和日记可能在两个不同的小室里,为了尽快发现真相,他们决定以最少的时间到达两个目标小室。但是某些小室只有会与蛇对话的人才能进入,也就是只有哈利一个人可以进入。
现在,哈利告诉你密室的结构,请你计算他们到达两个目标小室的最短时间。
Input
第一行 n,m,k 表示有n个小室m条通道,k间小室只有哈利可以进入。
第二行 k 个数,表示只有哈利可以进入的小室的编号。(若k=0,不包含该行)
接下来m行,每行3个数:a,b,c 表示a小室与b小室之间有一条需要花费c时间的通道。
最后一行,两个数 x,y 表示哈利与罗恩需要去的小室的编号
Output
一行,输出一个数,表示到达两个密室的最短时间。
表示第一眼看到题是个傻逼题. emmm
结果发现自己错了.
然后突然发现不卡数组,不卡时间.
于是我就跑了6遍
正常人都是跑4遍的emmm
这题坑点在于会存在4种情况
- 哈利到\(x\),罗恩到\(y\)
- 哈利到\(y\).罗恩到\(x\)
- 哈利不动,罗恩走遍\(x,y\)
- 罗恩不动,哈利走遍\(x,y\)
蒟蒻表示只考虑到了前两种.
还是大佬@_王小呆强啊 orz
然后就跑\(6\)遍\(dijkstra\)!
还改了好久的 qwq
代码
#include<cstdio>
#include<algorithm>
#include<queue>
#include<iostream>
#define int long long
#define R register
#define N 50008
using namespace std;
inline void in(int &x)
{
int f=1;x=0;char s=getchar();
while(!isdigit(s)){if(s=='-')f=-1;s=getchar();}
while(isdigit(s)){x=x*10+s-'0';s=getchar();}
x*=f;
}
int n,m,k;
int head[N],tot,a,b;
int dis[N],diss[N],disss[N],dissss[N];
int ans1,ans2,ans3,ans4,ans5,ans6;
int ans7,ans8,ans=21474836476666666LL;
struct cod{int u,v,w;}edge[N<<2];
struct hop
{
int u,d;
bool operator <(const hop&a)const
{
return d>a.d;
}
};
bool vis[N],ok[N];
inline void add(int x,int y,int z)
{
edge[++tot].u=head[x];
edge[tot].v=y;
edge[tot].w=z;
head[x]=tot;
}
inline void dij(int s,int ds[],bool flg)
{
for(R int i=1;i<=n;i++)ds[i]=21474836476666LL,vis[i]=false;
priority_queue<hop>q;
q.push((hop){s,0});ds[s]=0;
while(!q.empty())
{
int u=q.top().u;q.pop();
if(vis[u])continue;
vis[u]=true;
for(R int i=head[u];i;i=edge[i].u)
{
if(ok[edge[i].v] and !flg)continue;
if(!vis[edge[i].v] and ds[edge[i].v]>ds[u]+edge[i].w)
{
ds[edge[i].v]=ds[u]+edge[i].w;
q.push((hop){edge[i].v,ds[edge[i].v]});
}
}
}
}
signed main()
{
in(n),in(m),in(k);
for(R int i=1,x;i<=k;i++)in(x),ok[x]=true;
for(R int i=1,x,y,z;i<=m;i++)
{
in(x),in(y),in(z);
add(x,y,z);add(y,x,z);
}
in(a),in(b);
dij(1,dis,1);//哈利.
dij(1,diss,0);
ans1=dis[a],ans2=dis[b];
ans3=diss[a],ans4=diss[b];
ans=min(ans,max(ans3,ans2));
ans=min(ans,max(ans1,ans4));
dij(a,disss,1);//哈利
dij(a,dissss,0);
ans5=disss[b],ans6=dissss[b];
ans=min(ans,min(ans1+ans5,ans3+ans6));
dij(b,disss,1);
dij(b,dissss,0);
ans7=disss[a],ans8=dissss[a];
ans=min(ans,min(ans2+ans7,ans4+ans8));
printf("%lld",ans);
}
Dijkstra【p4943】密室的更多相关文章
- luogu P4943 密室 |最短路
题目描述 密室被打开了. 哈利与罗恩进入了密室,他们发现密室由n个小室组成,所有小室编号分别为:1,2,...,n.所有小室之间有m条通道,对任意两个不同小室最多只有一条通道连接,而每通过一条通道都需 ...
- Dijkstra 单源最短路径算法
Dijkstra 算法是一种用于计算带权有向图中单源最短路径(SSSP:Single-Source Shortest Path)的算法,由计算机科学家 Edsger Dijkstra 于 1956 年 ...
- 最短路径算法-Dijkstra
Dijkstra是解决单源最短路径的一般方法,属于一种贪婪算法. 所谓单源最短路径是指在一个赋权有向图中,从某一点出发,到另一点的最短路径. 以python代码为例,实现Dijkstra算法 1.数据 ...
- [板子]最小费用最大流(Dijkstra增广)
最小费用最大流板子,没有压行.利用重标号让边权非负,用Dijkstra进行增广,在理论和实际上都比SPFA增广快得多.教程略去.转载请随意. #include <cstdio> #incl ...
- POJ 2253 Frogger(Dijkstra)
传送门 Frogger Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 39453 Accepted: 12691 Des ...
- POJ 2387 Til the Cows Come Home(最短路 Dijkstra/spfa)
传送门 Til the Cows Come Home Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 46727 Acce ...
- Dijkstra 算法
all the nodes should be carectorized into three groups: (visited, front, unknown) we should pay spec ...
- 51nod 1459 迷宫游戏 (最短路径—Dijkstra算法)
题目链接 中文题,迪杰斯特拉最短路径算法模板题. #include<stdio.h> #include<string.h> #define INF 0x3f3f3f3f ],v ...
- 51nod1459(带权值的dijkstra)
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1459 题意:中文题诶- 思路:带权值的最短路,这道题数据也没 ...
随机推荐
- PyQt5学习--基本窗口控件--QMainWindow
QMainWindow主窗口为用户提供一个应用程序框架,它有自己的布局,可以在布局中添加控件.比如将工具栏.菜单栏和状态栏等添加到布局管理器中. 窗口类型介绍 QMainWindow.QWidget和 ...
- 在linux环境下让java代码生效的步骤
1.kill jboss 2.compile 3.deploy 4.bootstrap jboss.
- sqrti128
求平方根下取整,对于gcc type __uint128_t. ~45.5ns/op on i7-7700k@4.35G,即typical <200cyc/op. Together with u ...
- java md5加密 不依赖base64包
/** * MD5 加密 */ private String getMD5Str(String str) { MessageDigest messageDigest = null; try { mes ...
- Linux基础(1)
一.Linux的安装及相关配置 1.VMware Workstation安装CentOS7.0 图文版 详细步骤可以看连接:http://blog.csdn.net/alex_my/article/d ...
- HDU4889 Scary Path Finding Algorithm
Fackyyj loves the challenge phase in TwosigmaCrap(TC). One day, he meet a task asking him to find sh ...
- EL表达式中获取list长度(JSTL函数用法)
在jsp页面中不能通过${list.size}取列表长度,而是 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" pref ...
- python面向对象——类和对象
一.三大编程范式 编程范式即编程的方法论,标识一种编程风格 三大编程范式: 1.面向过程编程(流水线式) 优点:极大的降低了程序的复杂度 缺点:应用场景固定住了,可扩展性差 2.函数式编程 特点: a ...
- Swift开发学习(二):Playground
http://blog.csdn.net/powerlly/article/details/29674253 Swift开发学习:Playground 关于 对于软件用户.游戏玩家,大家一直都在提倡用 ...
- 简单粗暴的webapp语言国际化
不同语言以json格式存放不同文件 { "information": "个人资料", "fuckworld":"你好世界" ...