Bumped!【迪杰斯特拉消边、堆优化】
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 |
|---|---|
|
|
|
Sample Input 2 |
Sample Output 2 |
|---|---|
|
思路:
开始只学过 普通的迪杰斯特拉+链式前向星 对这个题开始就是想先跑一遍当做最小值 然后把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!【迪杰斯特拉消边、堆优化】的更多相关文章
- 最短路径-迪杰斯特拉(dijkstra)算法及优化详解
简介: dijkstra算法解决图论中源点到任意一点的最短路径. 算法思想: 算法特点: dijkstra算法解决赋权有向图或者无向图的单源最短路径问题,算法最终得到一个最短路径树.该算法常用于路由算 ...
- HDU 2680 最短路 迪杰斯特拉算法 添加超级源点
Choose the best route Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
- 迪杰斯特拉算法(Dijkstra) (基础dij+堆优化) BY:优少
首先来一段百度百科压压惊... 迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最 ...
- 说说关于洛谷P4779迪杰斯特拉的堆优化
众所周知,这题必须要用堆优化的迪杰斯特拉的堆优化才能过,否则60分(错失一等奖) 我没有得过一等奖但还是要说: P4779 全过程: struct node//堆中的比较函数 { int dis; i ...
- hdu2544 迪杰斯特拉题目优化
点击打开题目链接 迪杰斯特拉的用法不多讲,详见 点击打开链接 . 下面两个代码: 这个是用邻接矩阵存图的迪杰斯特拉. #include<stdio.h> int main() { int ...
- Codeforces Gym 100342H Problem H. Hard Test 构造题,卡迪杰斯特拉
Problem H. Hard TestTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100342/at ...
- 单源最短路径-迪杰斯特拉算法(Dijkstra's algorithm)
Dijkstra's algorithm 迪杰斯特拉算法是目前已知的解决单源最短路径问题的最快算法. 单源(single source)最短路径,就是从一个源点出发,考察它到任意顶点所经过的边的权重之 ...
- 图的最短路径---迪杰斯特拉(Dijkstra)算法浅析
什么是最短路径 在网图和非网图中,最短路径的含义是不一样的.对于非网图没有边上的权值,所谓的最短路径,其实就是指两顶点之间经过的边数最少的路径. 对于网图,最短路径就是指两顶点之间经过的边上权值之和最 ...
- 迪杰斯特拉和spfa
迪杰斯特拉 Dijkstra算法是典型的算法.Dijkstra算法是很有代表性的算法.Dijkstra一般的表述通常有两种方式,一种用永久和临时标号方式,一种是用OPEN, CLOSE表的方式,这里均 ...
随机推荐
- Null passed to a callee that requires a non-null argument
OC中定义的方法参数默认是不为空的,如果能够为空需要手动指定__nullable ,我想这个警告是提示开发者警惕可能空参数
- hdu6092 01背包
Rikka with Subset Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others ...
- SPL数据结构
数据结构是计算机存储.组织数据的方式. SPL提供了双向链表.堆栈.队列.堆.降序堆.升序堆.优先级队列.定长数组.对象容器. 基本概念Bottom:节点,第一个节点称Bottom:Top:最后添加的 ...
- PHP 数据库操作函数笔记
/建立 或者 关闭mysql服务器 @符号用于屏蔽错误信息 $link=@mysqli_connect('127.0.0.1','root','123456','php1',3306); if(mys ...
- [微信营销企划之路]001.环境搭建(XAMPP+WeiPHP)
引言 本系列适合0基础的人员,因为我们就是从0开始的,此系列记录我们步入微信营销企划并进行开发的一些经验分享,望与君共勉!作为刚刚踏入微信队伍中的新人的我们,如果有什么不对的地方,还望不吝赐教. 在开 ...
- Java IO(二十) PrintStream 和 DataOutputStream 异同
Java IO(二十) PrintStream 和 DataOutputStream 异同 一.相同点 都是继承与FileOutputStream,用于包装其它输出流. 二.不同点 (一).Print ...
- StackOverflow 创始人关于如何高效编程的清单.md
这是 StackOverflow 联合创始人 Jeff Atwood 注释的十戒.程序员普遍有很强的自尊心,都应该看看本文,打印下来时刻提醒自己. "无我编程"发生在开发阶段,表现 ...
- MVVM 小雏形 knockout
前言 knockout学过的当工具脚本用,就像jquery一样使用,学习成本15分钟,没学过的可学可不学. knockout 是上古神器,话说在远古开天辟地,前端到处是飞禽走兽,一片混乱. 这时候人类 ...
- AddressBook/AddressBookUI
概述 在iOS中,有2个框架可以访问用户的通讯录.从iOS6开始,需要得到用户的授权才能访问通讯录,因此在使用之前,需要检查用户是否已经授权ABAddressBookGetAuthorizationS ...
- Mysql安装与设置用户名、密码
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 关于MySQL程序中数据库调度的流程图解: 1-MySql数据库的安装 安装前要注意,看看当前系 ...