Easter Holidays(二次spfa求最短路、最长路+打印路径)

SPFA算法求单源最短路径 NULL 博文链接:https://128kj.iteye.com/blog/1716385 立即下载


Link:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=2904


Easter Holidays

Time Limit: 1 Second       Memory Limit: 32768 KB       Special Judge

Scandinavians often make vacation during the Easter holidays in the largest ski resort Are. Are provides fantastic ski conditions, many ski lifts and slopes of various difficulty profiles. However, some lifts go faster than others, and some are so popular that a queue forms at the bottom.

Per is a beginner skier and he is afraid of lifts, even though he wants to ski as much as possible. Now he sees that he can take several different lifts and then many different slopes or some other lifts, and this freedom of choice is starting to be too puzzling...
He would like to make a ski journey that:

  • starts at the bottom of some lift and ends at that same spot
  • has only two phases: in the first phase, he takes one or more lifts up, in the second phase, he will ski all the way down back to where he started
  • is least scary, that is the ratio of the time spent on the slopes to the time spent on the lifts or waiting for the lifts is the largest possible.

Can you help Per find the least scary ski journey? A ski resort contains n places, m slopes, and k lifts (2 <= n <= 1000, 1 <= m <= 1000, 1 <= k <= 1000). The slopes and lifts always lead from some place to another place: the slopes lead from places with higher altitude to places with lower altitude and lifts vice versa (lifts cannot be taken downwards).

Input

The first line of the input contains the number of cases - the number of ski resorts to process. Each ski resort is described as follows: the first line contains three integers n, m, and k. The following m lines describe the slopes: each line contains three integers - top and bottom place of the slope (the places are numbered 1 to n), and the time it takes to go down the slope (max. 10000). The final k lines describe the lifts by three integers - the bottom and top place of the lift, and the time it takes to wait for the lift in the queue and be brought to its top station (max. 10000). You can assume that no two places are connected by more than one lift or by more than one slope.

Output

For each input case, the program should print two lines. The first line should contain a space-separated list of places in the order they will be visited - the first place should be the same as the last place. The second line should contain the ratio of the time spent in the slopes to the time spent on the lifts or wating for the lifts. The ratio should be rounded to the closest 1/1000th. If there are two possibilities, then the rounding is away from zero (e.g., 1.9812 and 1.9806 become 1.981, 3.1335 becomes 3.134, and 3.1345 becomes 3.135). If there are multiple journeys that prior to rounding are equally scary, print an arbitrary one.

Sample Input

1
5 4 3
1 3 12
2 3 6
3 4 9
5 4 9
4 5 12
5 1 12
4 2 18

Sample Output

4 5 1 3 4
0.875

Source:  Norgesmesterskapet i Programmering,2004



AC  code:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
#include<map>
#include<cmath>
using namespace std;
#define N 1005
const int inf=0x3f3f3f3f;
struct node
{
    int v,w,next;
}g1[N],g2[N];
int t1,t2,dis1[N][N],dis2[N][N];
int head1[N],head2[N],pre1[N][N],pre2[N][N];
void add1(int u,int v,int w)     //pre数组记录路径      
{
    g1[t1].v=v;
    g1[t1].w=w;
    g1[t1].next=head1[u];
    head1[u]=t1++;
}
void add2(int u,int v,int w)
{
    g2[t2].v=v;
    g2[t2].w=w;
    g2[t2].next=head2[u];
    head2[u]=t2++;
}
void spfa1(int u)
{
    int i,s,v,mark[N];
    memset(mark,0,sizeof(mark));
    mark[u]=1;
    s=u;
    queue<int>q;
    q.push(s);
    dis1[u][u]=0;
    while(!q.empty())
    {
        u=q.front();
        q.pop();
        mark[u]=0;
        for(i=head1[u];i!=-1;i=g1[i].next)
        {
            v=g1[i].v;
            if(dis1[s][u]!=-1&&dis1[s][v]<dis1[s][u]+g1[i].w)
            {
                dis1[s][v]=dis1[s][u]+g1[i].w;
                pre1[s][v]=u;
                if(!mark[v])
                {
                    q.push(v);
                    mark[v]=1;
                }
            }
        }
    }
}
void spfa2(int u)
{
    int i,s,v,mark[N];
    memset(mark,0,sizeof(mark));
    mark[u]=1;
    s=u;
    queue<int>q;
    q.push(s);
    dis2[u][u]=0;
    while(!q.empty())
    {
        u=q.front();
        q.pop();
        mark[u]=0;
        for(i=head2[u];i!=-1;i=g2[i].next)
        {
            v=g2[i].v;
            if(dis2[s][u]!=inf&&dis2[s][v]>dis2[s][u]+g2[i].w)
            {
                dis2[s][v]=dis2[s][u]+g2[i].w;
                pre2[s][v]=u;
                if(!mark[v])
                {
                    q.push(v);
                    mark[v]=1;
                }
            }
        }
    }
}
int main()
{
	//freopen("D:\in.txt","r",stdin);
    int T,n,m,k,u,v,w,i,j;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d%d",&n,&m,&k);
        memset(head1,-1,sizeof(head1));
        memset(head2,-1,sizeof(head2));
        t1=t2=0;
        for(i=0;i<m;i++)
        {
            scanf("%d%d%d",&u,&v,&w);
            add1(u,v,w);
        }
        for(i=0;i<k;i++)
        {
            scanf("%d%d%d",&u,&v,&w);
            add2(u,v,w);
        }
        memset(pre1,-1,sizeof(pre1));
        memset(pre2,-1,sizeof(pre2));
        memset(dis1,-1,sizeof(dis1));
        for(i=1;i<=n;i++)
        {
            for(j=1;j<=n;j++)
                dis2[i][j]=inf;
        }
        for(i=1;i<=n;i++)
        {
            spfa1(i);      //上去求最大值
            spfa2(i);      //下来求最小值
        }
        double ans=0;
        int s,t;
        for(i=1;i<=n;i++)
        {
            for(j=1;j<=n;j++)
            {
                if(i==j||dis2[i][j]>=inf||dis1[j][i]==-1)
                    continue;
                double tmp=1.0*dis1[j][i]/dis2[i][j];
                if(tmp>ans)
                {
                    ans=tmp;
                    s=i;t=j;
                }
            }
        }
        
        printf("%d ",s);
        i=s;j=t;k=0;
        int a[N];       //记录答案路径
        while(pre2[i][j]!=s)    //从终点向起始点找路径
        {                       //到起始点结束
            a[k++]=pre2[i][j];  
            j=pre2[i][j];
        }
        for(i=k-1;i>=0;i--)
            printf("%d ",a[i]);
        printf("%d ",t);
        i=t;j=s;k=0;
        while(pre1[i][j]!=t)    
        {
            a[k++]=pre1[i][j];
            j=pre1[i][j];
        }
        for(i=k-1;i>=0;i--)
            printf("%d ",a[i]);
        printf("%d\n",s);
        printf("%.3f\n",ans);
    }
    return 0;
}


评价模型——层次分析法(AHP)与熵权法(EWM) 层次分析法是定性与定量结合的多准则决策、评价方法。将决策的有关元素分解成目标层、准则层和方案层,并通过人们的判断对决策方案的优劣进行排序,在此基础上进行定性和定量分析。它把人的思维过程层次化、数量化,并用数学为分析、决策、评价、预报和控制提供定量的依据。 阅读详情

相关推荐

IDM更改下载路径的详细指南

Internet Download Manager(IDM)是一款功能全面的下载加速工具,它支持多种浏览器和协议,能够显著提升下载速度,同时提供断点续传、多线程下载等实用功能。IDM的用户界面简洁明了,操作便捷,使得用户能够轻松管理下载任务。此外,IDM还支持自动分类下载文件、定时下载等高级功能,进一步提升了用户的下载体验。通过本文的介绍,相信用户已经掌握了如何在IDM中更改下载路径的方法。这一功能不仅提升了下载效率和文件管理便捷性,还满足了用户的个性化需求。

nntxthml的博客 1763

P1807 最长路_NOI导刊2010提高(07)

P1807 最长路_NOI导刊2010提高(07) 题目描述 设G为有n个顶点的有向无环图,G中各顶点的编号为1到n,且当为G中的一条边时有i < j。设w(i,j)为边的长度,请设计算法,计算图G中<1,n>间的最长路径。 输入输出格式 输入格式: 输入文件longest.in的第一行有两个整数n和m,表示有n个顶点和m条边,接下...

weixin_30539835的博客 393

华为AR6140E/S5735设备密码策略配置全攻略:从复杂度到锁定机制

本文详细介绍了华为AR6140E/S5735设备的密码策略配置方法,涵盖密码复杂度、时效性和防护性三大核心维度。通过具体的CLI命令示例,指导管理员如何设置密码长度、字符组合、有效期及登录失败锁定等安全机制,为企业网络提供全面的用户名密码防护策略。

weixin_30836759的博客 531

SPFA求最大路

求最长路可以将边权乘以-1,然后求最短路即可,之后最短路取相反数就是最大路。 SPFA板子 vector<int>v[MAX_N],w[MAX_N]; int have[MAX_N],dis[MAX_N]; void spfa(int be){ int i; queue<skt>q; skt k; have[be]=true; k.x...

EDGiboy的博客 725

核函数——原理剖析

(Kernel Function)是机器学习和统计学中的一个重要概念,特别是在支持向量机(SVM)和其他基于核方法的算法中。核函数的主要作用是通过一个隐式的方式将数据映射到一个高维空间,从而使得在该高维空间中线性不可分的问题变得线性可分。没关系,现在让我们抛开一切无关的事情,花20分钟来认真领会一下,核函数的原理到底是什么。然后我们来说什么什么样的函数有资格称为核函数,也就是上面说的一个函数的内积矩阵是半正定矩阵。中的分布如左图所示。中是不可实现的,那如果我们将原始空间中的所有样本点,通过一个映射关系。

m0_70254540的博客 1587

团体程序设计天梯赛竞赛题--登顶题【L3-039 攀岩】

登顶级 3 道题,每道题 30 分,满分为 90 分。

Pretty Boy Fox的博客 654

SPFA,最短/长路

SPFA,最短路,最长路

laosong_的博客 326

ROS2入门到精通—— ROS2实战专栏(实时更新)

Nav2专栏介绍

BigDavid123的博客 2370

最长路(有负权边)spfa

前言:这个题目中有负权重的边,狄克斯特拉算法坑定是用不了的,学一下spfa算法吧,发现就是bellman算法的队列优化。那么我们队列优化的还可以查询负环吗,答案是可以的,我们可以增加一个cnt数组,记录最短路的长度,长度超过n就是存在。还有一个关键就是我们求最长的权重,我们要将边权重变为-的,最后答案取反就行。

wniuniu_的博客 579

建设银行核心系统建设历程全网最详细记录

中国建设银行核心系统数字化转型之路 摘要:中国建设银行自1954年成立以来,其核心系统经历了从分散到集中、再到分布式架构的演进历程。2002-2005年完成的数据大集中工程(DCC)实现了全行业务统一管理,2010年启动的"新一代核心系统"构建了企业级架构,率先实现"一次研发,全行共享"。2020年起全面推进主机下移战略,通过分布式架构改造,攻克八大关键技术难题,于2024年7月完成境内外全量核心业务下移,日均同步数据8亿条,实现金融核心系统完全自主可控。这一转型不仅

银行信息系统应用架构详解 4872

终于搞定!Cloudflare Tunnel 报错 Error 1033,一次完整修复记录

最近遇到了 Cloudflare Tunnel Error 1033 报错的问题,本文记录了完整的排查和解决方案💡

XiaoqiangClub的博客 1762

[APIO2009]抢掠计划 (强连通+SPFA求最长路) HQG_AC的博客

传送门 【题意】: 给一张图,每个点有一个ATM机,而其中的部分点是酒吧(可作为终点)。 抢掠计划就是从起点(1号点)出发,到终点的途中,将ATM机中的钱抢走。 问最多能抢到多少钱。 【注意】: 本题还以一种N&lt;=1000000 的升级版,因为硬件原因(60万以上会爆栈),要写非递归的tarjan,在这里不展开。 【解法】: 因为是有向图,某些点又组成了环,又是让你求最长,综...

Hacheylight 291

【新能源汽车DCDC变换器测试优化全攻略:解决电能质量/发热/过充等核心痛点】

高压直流转12V低压的DCDC变换器是新能源汽车电源系统的核心枢纽,承担着为整车低压附件、控制器及12V蓄电池供电/补电的关键作用。在新能源汽车乘用车、商用车等不同车型实际运营中,因PDU内DC/AC等模块干扰、DCDC自身设计缺陷、整车匹配性不佳及测试验证不充分,频发12V输出电能质量差导致后端元器件烧毁、变换器发热严重、蓄电池过充/欠充、智能补电功能失效等问题,还伴随低压侧电压瞬跌/浪涌、电磁干扰超标、振动后接触不良、高温下效率骤降等行业高频故障,直接影响整车可靠性和运营安全性。本文基于国标。

优快云-新能源汽车研发测试专业博主 1266

zoj 3088 Easter Holidays (SPFA 求最长路 最短路 + 打印路径)

Easter Holidays Time Limit: 1 Second      Memory Limit: 32768 KB      Special Judge Scandinavians often make vacation during the Easter holidays in the largest ski resort Are. Are provides fa

To be what you what to be! 1108

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

zoj 3088 Easter Holidays(最长路+最短路+打印路径)

Scandinavians often make vacation during the Easter holidays in the largest ski resort Are. Are provides fantastic ski conditions, many ski lifts and slopes of various difficulty profiles. Howeve...

anyi7265的博客 181

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

ZOJ3088 Easter Holidays spfa 最长路 最短路 路径打印

题目链接: 3088 题意:一个滑雪胜地包含了n 个地点,m 个滑雪斜坡,k 架雪橇,其中2≤n≤1000、1≤m≤1000、1≤k≤1000。滑雪斜坡和雪橇总是从一个地点到另一个地点:滑雪斜坡是从高地点到低地点,而雪橇刚好相反(注意,雪橇不能下降)。Per 是一个滑雪初学者,他很害怕雪橇,尽管他想滑得尽可能快。现在,他发现他可以选择不同的雪橇和滑雪斜坡。他现在

旧时光 1108

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

hdu3696(spfa求最长路)

链接:点击打开链接 题意:给出n个物品的价值和数量,有m个关系,每种关系的格式为(a0,b1,a1,b2,a2,…,bk-1,ak-1)表示1个ai可以转换成bi+1个ai+1,问最后n个物品转换后的最大价值和 代码:#include #include #include #include #include #include #include #include #include

stay_accept的专栏 1560

图的基本应用——最长路(南昌理工学院暑期ACM集训)

图论 这是一道图论的基础题,也是模板题,在很多比赛中都很常见,大家可以先看看洛谷题目 最长路 题目描述 设 G 为有 nn 个顶点的带权有向无环图,G 中各顶点的编号为 1 到 n,请设计算法,计算图 G 中 <1,n><1,n> 间的最长路径。 输入格式 输入的第一行有两个整数,分别代表图的点数 n 和边数 m。 第 22 到第 (m + 1)行,每行 3 个整数 u,v,w,代表存在一条从 u 到 v 边权为 w 的边。 输出格式 输出一行一个整数,代表 1 到 n 的最长路。

FOR_LONG的博客 716

算法竞赛实战:当题目同时要求最短路和最长路时该怎么办?(附SPFA实现模板)

本文深入解析了算法竞赛中同时要求最短路和最长路的复合路径问题。针对Dijkstra算法无法直接求解最长路的经典陷阱,文章详细阐述了其原理,并推荐使用SPFA算法作为通用解决方案。文中提供了可直接用于赛场的C++和Python版SPFA实现模板,并分析了典型竞赛案例的解题思路,帮助选手灵活应对此类问题。

blockchain9miner的博客 451

ACM/ICPC 之 SPFA练习两道(ZOJ3088-ZOJ3103)

两道题都需要进行双向SPFA,比范例复杂,代码也较长,其中第二题应该可以用DFS或者BFS做,如果用DFS可能需要的剪枝较多。 ZOJ3088-Easter Holydays //利用SPFA找出下降最长路径和上升最短路径,输出最大的比值和回路路径 //Time:0Ms Memory:328K #include<iostream>...

disuo8001的博客 274

SPFA算法求固定点到其它点 最短 最长 路程问题

点击:理解请参考 例题:https://www.luogu.com.cn/problem/P1807 如果求最短路径 :f[v]=max(f[v],f[u]+mp[u][i].n); f [ ]数组你要先初始化 无穷大 如果求最长路径: f[v]=min(f[v],f[u]+mp[u][i].n); f [ ]数组你要先初始化 无穷小 还有 就是这个spfa算法跟 关键路径(拓扑) 挺像的 就稍微改改 例题正确代码: //思路 建立两个表 位置相同 存边的长度 #include<bits/stdc++

Qisi_Li的博客 362

图算法补充(SPFA,最长路径)

1. SPFA(Shortest Path Faster Algorithm) 1994年,西南交通大学的段凡丁发表了SPFA,SPFA在Bellman-ford algorithm的基础上加上一个队列优化,减少了冗余的松弛操作。关于最短路径的SPFA快速算法:http://www.cnki.com.cn/Article/CJFDTotal-XNJT402.015.htmwiki:https://

Jiajun Zhu 5621

spfa求最长路

http://poj.org/problem?id=1932 spfa求最长路,判断dist[n] > 0,需要注意的是有正环存在,如果有环存在,那么就要判断这个环上的某一点是否能够到达n点,如果能,就说明可以到达,否则,就说明不能。 1 /*********************************************************************...

weixin_30881367的博客 387

有向图最长路径算法_【洛谷日报#16】SPFA算法教学

目录引入1:单源最短路原理&讲解模拟&代码引入2:判正(负)环BFS版SPFADFS版SPFA例题总结后话SPFA算法是一种图论算法,可以看作是Bellman-Ford算法的队列优化。它可以求出单源最短路,也可检测到负环,实现起来也比较容易。但是现在很多题目会卡SPFA,所以要看情况使用。引入1:单源最短路问:求带权有向图上一个源点到其他点的最短路径距离如果没有非负边权,我们自然可...

weixin_39946460的博客 1418

ZOJ-3088 Easter Holidays

Easter Holidays Time Limit: 1 Second      Memory Limit: 32768 KB      Special Judge Scandinavians often make vacation during the Easter holidays in the largest ski resort Are. Are provides fanta

JSure的代码库 1080

zoj 3088 spfa 最短&最长路径

一看就知道要建立两个图- -  一开始写不知道哪里

wishcxz_acm 902
上一篇: HDU1224 Free DIY Tour(spfa+记录路径)
下一篇: Wormholes(题意抽象+SPFA判负权环)
林下的码路
博客等级 码龄12年 295粉丝 506原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林下的码路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值