Bumped!

题目链接(点击)

Peter returned from the recently held ACM ICPC World Finals only to find that his return flight was overbooked and he was bumped from the flight! Well, at least he wasn’t beat up by the airline and he’s received a voucher for one free flight between any two destinations he wishes.

He is already planning next year’s trip. He plans to travel by car where necessary, but he may be using his free flight ticket for one leg of the trip. He asked for your help in his planning.

He can provide you a network of cities connected by roads, the amount it costs to buy gas for traveling between pairs of cities, and a list of available flights between some of those cities. Help Peter by finding the minimum amount of money he needs to spend to get from his hometown to next year’s destination!

Input

The input consists of a single test case. The first line lists five space-separated integers nn, mm, ff, ss, and tt, denoting the number of cities nn (0<n≤500000<n≤50000), the number of roads mm (0≤m≤1500000≤m≤150000), the number of flights ff (0≤f≤10000≤f≤1000), the number ss (0≤s<n0≤s<n) of the city in which Peter’s trip starts, and the number tt (0≤t<n0≤t<n) of the city Peter is trying to travel to. (Cities are numbered from 00 to n−1n−1.)

The first line is followed by mm lines, each describing one road. A road description contains three space-separated integers ii, jj, and cc (0≤i,j<n,i≠j0≤i,j<n,i≠j and 0<c≤500000<c≤50000), indicating there is a road connecting cities ii and jj that costs cccents to travel. Roads can be used in either direction for the same cost. All road descriptions are unique.

Each of the following ff lines contains a description of an available flight, which consists of two space-separated integers uu and vv (0≤u,v<n0≤u,v<n, u≠vu≠v) denoting that a flight from city uu to city vv is available (though not from vv to uu unless listed elsewhere). All flight descriptions are unique.

Output

Output the minimum number of cents Peter needs to spend to get from his home town to the competition, using at most one flight. You may assume that there is a route on which Peter can reach his destination.

Sample Input 1 Sample Output 1
8 11 1 0 5
0 1 10
0 2 10
1 2 10
2 6 40
6 7 10
5 6 10
3 5 15
3 6 40
3 4 20
1 4 20
1 3 20
4 7
45

Sample Input 2

Sample Output 2
8 11 1 0 5
0 1 10
0 2 10
1 2 10
2 6 40
6 7 10
5 6 10
3 5 15
3 6 40
3 4 20
1 4 20
1 3 30
4 7

思路:

开始只学过 普通的迪杰斯特拉+链式前向星 对这个题开始就是想先跑一遍当做最小值 然后把f张机票 每次使用一张再求出最短路 最后果断T了

没办法比赛完去学堆优化 其实和普通的没多大差别 只是使用了优先队列

学会之后就接着做这个题 结果卡在 23/25 了 以为是链式前向星不可以消边 就感觉用迪杰斯特拉消边不对(我也查了资料说vector和邻接矩阵方便消边)可vector 不会 所以就接着学

学完提交还是卡23了 就知道肯定是那个地方个人习惯问题

找了好长时间终于发现 是const int INF时候INF 超 int 了 (下次肯定好好审一审它)

顿时感觉……

不过挺开心的 还学会了vector存图 迪杰斯特拉堆优化 还自己把链式前向星的消边搞了出来

有时间就再写一下vector

AC代码:

1.链式前向星+迪杰斯特拉堆优化

#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
typedef long long LL;
const int MAX=1e6;
const LL MAX1=1e10;
LL n;
LL head[MAX+5],flag[MAX+5],ans=0;
LL dis[MAX+5],vis[MAX+5];
struct note{
LL to;
LL len;
LL next;
}edge[MAX+5];
struct note1{
LL x;
LL y;
}edge1[MAX+5];
struct node{
LL to,len;
node(LL a,LL b){
to=b;
len=a;
}
friend bool operator < (node a,node b){ ///是<而不是< node
return a.len>b.len;
}
};
void addnode(LL u,LL v,LL w)
{
edge[ans].to=v;
edge[ans].len=w;
edge[ans].next=head[u];
flag[u]=head[u];
head[u]=ans++;
}
void allbegin()
{
memset(head,-1,sizeof(head));
ans=0;
}
priority_queue<node>q;
void diji(LL s)
{
for(LL i=0;i<=n;i++){ ///不能忘记将diji的数组初始化
dis[i]=MAX1;
vis[i]=0;
}
while(!q.empty()){
q.pop();
}
dis[s]=0;
q.push(node(0,s));
while(!q.empty()){
node num=q.top();
q.pop(); ///用完后把最上层去掉
if(vis[num.to]){
continue;
}
vis[num.to]=1;
for(LL i=head[num.to];~i;i=edge[i].next){
if((dis[edge[i].to]>dis[num.to]+edge[i].len)&&edge[i].len!=MAX1+1){
dis[edge[i].to]=dis[num.to]+edge[i].len; ///copy完改符号
q.push(node(dis[edge[i].to],edge[i].to));///将这个to点对应的len重新放入队列中
}
}
}
}
int main()
{
LL m,f,a1,a2;
scanf("%lld%lld%lld%lld%lld",&n,&m,&f,&a1,&a2);
allbegin();
for(LL i=0;i<m;i++){
LL u,v,w;
scanf("%lld%lld%lld",&u,&v,&w);
addnode(u,v,w);
addnode(v,u,w);
}
for(LL i=0;i<f;i++){
LL u,v;
scanf("%lld%lld",&edge1[i].x,&edge1[i].y);
}
diji(a1);
LL minn=dis[a2];
for(LL i=0;i<f;i++){
diji(edge1[i].x);
LL num=dis[edge1[i].y];
addnode(edge1[i].x,edge1[i].y,0);
diji(a1);
if(minn>dis[a2]){
minn=dis[a2];
}
if(num==MAX1){
edge[ans-1].len=MAX1+1;
}
else{
edge[ans-1].len=num;
}
}
printf("%lld\n",minn);
return 0;
}

2、vector+链式前向星堆优化

#include<stdio.h>
#include<vector>
#include<queue>
using namespace std;
typedef long long LL;
const LL INF=1e10;
const int MAX=150010; int n;
struct node{
int to;
LL len;
node(int _to=0,LL _len=0):to(_to),len(_len){ }
bool operator<(const node &r)const{
return len>r.len;
}
};
struct note{
int to;
LL len;
note(int _to=0,LL _len=0):to(_to),len(_len){}
};
int vis[MAX+5];
LL dis[MAX+5];
vector<note>v[MAX+5];
void diji(int s)
{
for(int i=0;i<MAX+5;i++){
vis[i]=0,dis[i]=INF;
}
priority_queue<node>q;
while(!q.empty()){
q.pop();
}
dis[s]=0;
q.push(node(s,0));
node num;
while(!q.empty()){
num=q.top();
q.pop();
int u=num.to;
if(vis[u]){
continue;
}
vis[u]=1;
for(int i=0;i<v[u].size();i++){
int to=v[u][i].to;
LL len=v[u][i].len;
if(!vis[to]&&dis[to]>dis[u]+len){
dis[to]=dis[u]+len;
q.push(node(to,dis[to]));
}
}
}
}
int main()
{
int m,f,a1,a2;
scanf("%d%d%d%d%d",&n,&m,&f,&a1,&a2);
for(int i=0;i<m;i++){
int u;
node num;
scanf("%d%d%lld",&u,&num.to,&num.len);
v[u].push_back(note(num.to,num.len));
v[num.to].push_back(note(u,num.len));
}
diji(a1);
LL minn=dis[a2];
for(int i=0;i<f;i++){
int u;
node num;
scanf("%d%d",&u,&num.to);
num.len=0;
v[u].push_back(note(num.to,num.len));
diji(a1);
minn = min(minn,dis[a2]);
v[u].erase(v[u].end()-1);
}
printf("%lld\n",minn);
return 0;
}

Bumped!【迪杰斯特拉消边、堆优化】的更多相关文章

  1. 最短路径-迪杰斯特拉(dijkstra)算法及优化详解

    简介: dijkstra算法解决图论中源点到任意一点的最短路径. 算法思想: 算法特点: dijkstra算法解决赋权有向图或者无向图的单源最短路径问题,算法最终得到一个最短路径树.该算法常用于路由算 ...

  2. HDU 2680 最短路 迪杰斯特拉算法 添加超级源点

    Choose the best route Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  3. 迪杰斯特拉算法(Dijkstra) (基础dij+堆优化) BY:优少

    首先来一段百度百科压压惊... 迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最 ...

  4. 说说关于洛谷P4779迪杰斯特拉的堆优化

    众所周知,这题必须要用堆优化的迪杰斯特拉的堆优化才能过,否则60分(错失一等奖) 我没有得过一等奖但还是要说: P4779 全过程: struct node//堆中的比较函数 { int dis; i ...

  5. hdu2544 迪杰斯特拉题目优化

    点击打开题目链接 迪杰斯特拉的用法不多讲,详见  点击打开链接 . 下面两个代码: 这个是用邻接矩阵存图的迪杰斯特拉. #include<stdio.h> int main() { int ...

  6. Codeforces Gym 100342H Problem H. Hard Test 构造题,卡迪杰斯特拉

    Problem H. Hard TestTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100342/at ...

  7. 单源最短路径-迪杰斯特拉算法(Dijkstra's algorithm)

    Dijkstra's algorithm 迪杰斯特拉算法是目前已知的解决单源最短路径问题的最快算法. 单源(single source)最短路径,就是从一个源点出发,考察它到任意顶点所经过的边的权重之 ...

  8. 图的最短路径---迪杰斯特拉(Dijkstra)算法浅析

    什么是最短路径 在网图和非网图中,最短路径的含义是不一样的.对于非网图没有边上的权值,所谓的最短路径,其实就是指两顶点之间经过的边数最少的路径. 对于网图,最短路径就是指两顶点之间经过的边上权值之和最 ...

  9. 迪杰斯特拉和spfa

    迪杰斯特拉 Dijkstra算法是典型的算法.Dijkstra算法是很有代表性的算法.Dijkstra一般的表述通常有两种方式,一种用永久和临时标号方式,一种是用OPEN, CLOSE表的方式,这里均 ...

随机推荐

  1. 初识Mysql 外键

    1.创建学生表(主表) CREATE TABLE `stu` ( `stunum` int(10) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT N ...

  2. js 三级联动 1

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  3. OpenStack的Swift组件详解

    一:简介     一.背景 1. Swift 最初是由 Rackspace 公司开发的高可用分布式对象存储服务(Object  Storage Service),并于 2010 年贡献给 OpenSt ...

  4. idea打印中文乱码

    一.问题情况: IntelliJ IDEA 控制台输出中文乱码部分如图所示: 二.解决方法: 1.打开tomcat配置页面,Edit Configurations. 2.选择项目部署的tomcat,在 ...

  5. web自动化的一些基础知识

    selenium 原理 就是通过webdriver 给浏览器的驱动发送命令,打开浏览器,建立http通信请求 然后通过发送各种命令让浏览器进而执行各种操作 xpath 语法 #xpath定位总结:'' ...

  6. eatwhatApp开发实战(九)

    之前我们为app在item项上添加了点击出现修改对话框,对店名进行修改的功能,其中我们会发现我们点击item和点击item上的按钮会有点击冲突.这次我们来修正下这个问题,同时介绍item项的长按点击O ...

  7. 在 MacOS 中使用 multipass 安装 microk8s 环境

    在 MacOS 中使用 multipass 安装 microk8s 环境 Multipass & MicroK8s 介绍 What is Kubernetes? Kubernetes clus ...

  8. 透过 NestedScrollView 源码解析嵌套滑动原理

    NestedScrollView 是用于替代 ScrollView 来解决嵌套滑动过程中的滑动事件的冲突.作为开发者,你会发现很多地方会用到嵌套滑动的逻辑,比如下拉刷新页面,京东或者淘宝的各种商品页面 ...

  9. Chisel3 - Tutorial - ByteSelector

    https://mp.weixin.qq.com/s/RQg2ca1rwfVHx_QG-IOV-w   字节选择器.   参考链接: https://github.com/ucb-bar/chisel ...

  10. (Java实现) 洛谷 P1025 数的划分

    题目描述 将整数n分成k份,且每份不能为空,任意两个方案不相同(不考虑顺序). 例如:n=7,k=3,下面三种分法被认为是相同的. 1,1,5; 1,5,1; 5,1,1. 问有多少种不同的分法. 输 ...