6.12友谊赛T4城市交通费题解
与普通的最短路径不同的是,题目中新引入了一个计入总体的费用——城市建设费。由于城市建设费由整体的某最大值决定,导致解没有最优子结构的性质,给思维带来难度。
既然最棘手的是城市建设费,我们就对它分类讨论。为了分类有效,我们先把城市繁华度从小到大排个序,这样分类讨论时当前路径的城市的最大繁华度即为不严格递增的。这样,我们便可以考虑当前路径只可能经过前k个最不繁华的城市(可以不经过,但只要经过,经过的城市就一定在那前k个最不繁华的城市中),让k从小到大递增(每次+1)至n,对于每个k值,更新一下最短路径,再看一下第k个最不繁华的城市是否可以更新答案。由此我们想到了FLOYD算法。
见AC代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cctype>
#include<cstring> using namespace std; int ans,n,m,q,a[][],f[][],p[],t[]; char ch; int read()
{
ans=;
ch=getchar();
while(!isdigit(ch)) ch=getchar();
while(isdigit(ch)) ans=(ans<<)+(ans<<)+ch-'',ch=getchar();
return ans;
} int cmp(int x,int y)//排序最终效果:把t数组排序,使t数组满足编号为ti的城市是第i个最不繁华的城市
{
return p[x]<p[y];
} int main()
{
// freopen("road.in","r",stdin);
// freopen("road.out","w",stdout);
memset(a,,sizeof a);//把a数组(存两点间最短路径)初始化为一个足以解题的无穷大
n=read(),m=read(),q=read();
for(int i=;i<=n;i++) p[i]=read();
for(int i=;i<=n;i++) t[i]=i;//一开始t数组应有所有城市的编号,所以不能忘了初始化
int u,v,w;
for(int i=;i<=m;i++)
{
u=read(),v=read(),w=read();
a[u][v]=min(a[u][v],w);//用邻接矩阵存边不要忘了防重边
a[v][u]=min(a[v][u],w);
}
for(int i=;i<=n;i++) a[i][i]=;
for(int i=;i<=n;i++) //初始化两城市直接连通(路径不经过其他任何城市)的情况
for(int j=;j<=n;j++)
f[i][j]=a[i][j]+max(p[i],p[j]);
sort(t+,t++n,cmp);
for(int k=;k<=n;k++)//当FLOYD的最外层循环枚举到k是,路径经过的中间城市只可能是前k个最不繁华的城市(因为目前只用他们进行了松弛操作)
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
{
a[i][j]=min(a[i][j],a[i][t[k]]+a[t[k]][j]);
f[i][j]=min(f[i][j],a[i][j]+max(p[i],max(p[j],p[t[k]])));
}
for(int i=;i<=q;i++)
{
u=read();v=read();
printf("%d\n",f[u][v]);
}
return ;
}
总结:算法中有很多细节。初始时的边界条件要记得考虑。如果一开始对某个变量的有要求,就不能忘了初始化。用邻接矩阵存边的话不要忘了去重边。
6.12友谊赛T4城市交通费题解的更多相关文章
- CSharpGL(12)用T4模板生成CSSL及其renderer代码
CSharpGL(12)用T4模板生成CSSL及其renderer代码 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码中包含10多个独立 ...
- 【6.12校内test】T3 城市交通费
要不我先去写T2吧(逃 先把题目搞上来: [问题描述] 有 n 个城市,编号 1~n.其中 i 号城市的繁华度为 pi.省内有 m 条可以双向同行的高速 公路,编号 1~m.编号为 j 的高速公路连接 ...
- BSOJ3760||洛谷P1453 城市环路 题解
城市环路 Description 一座城市,往往会被人们划分为几个区域,例如住宅区.商业区.工业区等等.B市就被分为了以下的两个区域——城市中心和城市郊区.在着这两个区域的中间是一条围绕B市的环路,环 ...
- 从零开始编写自己的C#框架(12)——T4模板在逻辑层中的应用(一)(附源码)
对于T4模板很多朋友都不太熟悉,它在项目开发中,会帮我们减轻很大的工作量,提升我们的开发效率,减少出错概率.所以学好T4模板的应用,对于开发人员来说是非常重要的. 园子里对于T4模板的介绍与资料已经太 ...
- T4 分配时间 题解
问题描述 小王参加的考试是几门科目的试卷放在一起考,一共给 t 分钟来做.他现在已经知道每 门科目花的时间和得到的分数的关系,还有写名字要的时间(他写自己的名字很慢)请帮他 算一下他最高能得几分.总分 ...
- luogu P4842 城市旅行
嘟嘟嘟 好题,好题 刚开始突发奇想写了一个\(O(n ^ 2)\)暴力,结果竟然过了?!后来才知道是上传题的人把单个数据点开成了10s-- 不过不得不说我这暴力写的挺好看的.删边模仿链表删边,加边的时 ...
- 网络流24(san)题题解汇总
开坑(烂尾预定 1.餐巾计划问题 题解 2.最小路径覆盖问题 题解 3.试题库问题 题解 4.[CTSC1999]家园 题解 5.骑士共存问题 题解 6.最长不下降子序列问题 题解 7.深海机器人问题 ...
- 2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色
2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 数据结构学傻的做法: 对每种颜色开动态开点线段树直接维 ...
- Tesla T4视频编码性能分析
Tesla T4视频编码性能分析 从开普勒开始的所有 NVIDIA GPUs 都支持完全加速的硬件视频编码: GPUs 支持完全加速的硬件视频解码.最近发布的图灵硬件提供了张量核心和更好的机器学习性能 ...
随机推荐
- Go语言入门篇-Golang之文本编码处理
Golang之文本编码处理
- 使用原生js 获取用户访问项目的浏览器类型
想要获取浏览器的类型很简单,网上提供了很多方法,但是看过之后,都是根据浏览器内核来判断是ie,谷歌,火狐,opeara的, 所以不能进一步判断在国内使用的主流浏览器类型,比如360,百度,搜狐浏览器等 ...
- Canvas入门02-绘制直线
主要使用的API有: context.moveTo(x,y) 声明线的起始坐标 context.lineTo(x,y) 声明线的下一个坐标 context.fillStyle 声明线的填充颜色 co ...
- docker--docker 容器操作
6 docker 容器操作 容器是 docker 镜像的运行时实例. 6.1 创建容器 docker run [options] image command [ARG...]options选项: ‐i ...
- python并发编程之进程池、线程池、协程
需要注意一下不能无限的开进程,不能无限的开线程最常用的就是开进程池,开线程池.其中回调函数非常重要回调函数其实可以作为一种编程思想,谁好了谁就去掉 只要你用并发,就会有锁的问题,但是你不能一直去自己加 ...
- SVN服务器和客户端使用教程总结
一.SVN简介 Subversion是什么? 它是一个自由/开源的版本控制系统,一组文件存放在中心版本库,记录每一次文件和目录的修改,Subversion允许把数据恢复到早期版本,或是检查数据修改的历 ...
- Mac-peizhi
##1-JMeter4export JMETER_HOME=/Users/wulei/softwares/installedsoftwares/apache-jmeter-4.0export CLAS ...
- mysql数据库问题———登录进去无法操作显示You must reset your password using ALTER USER statement before executing this statement
linux操作mysql数据库,可以登陆进去,但是操作所有命令都显示You must reset your password using ALTER USER statement before exe ...
- 只使用非递归的mutex
mutex分为递归(以下简写为rm)和非递归(以下简写为nrm)两种,它们的唯一区别在于:同一个线程可以重复对rm加锁,但是不能重复对nrm加锁. 虽然rm使用起来要更加方便一些,并且不用考虑一个线程 ...
- ajax后台请求两种方法(js和jQuery)
(1)js的ajax var xmlHttp; if(window.XMLHttpRequest){ xmlHttp=new XMLHttpRequest(); }else{ xmlHttp=new ...