与普通的最短路径不同的是,题目中新引入了一个计入总体的费用——城市建设费。由于城市建设费由整体的某最大值决定,导致解没有最优子结构的性质,给思维带来难度。

既然最棘手的是城市建设费,我们就对它分类讨论。为了分类有效,我们先把城市繁华度从小到大排个序,这样分类讨论时当前路径的城市的最大繁华度即为不严格递增的。这样,我们便可以考虑当前路径只可能经过前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城市交通费题解的更多相关文章

  1. CSharpGL(12)用T4模板生成CSSL及其renderer代码

    CSharpGL(12)用T4模板生成CSSL及其renderer代码 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码中包含10多个独立 ...

  2. 【6.12校内test】T3 城市交通费

    要不我先去写T2吧(逃 先把题目搞上来: [问题描述] 有 n 个城市,编号 1~n.其中 i 号城市的繁华度为 pi.省内有 m 条可以双向同行的高速 公路,编号 1~m.编号为 j 的高速公路连接 ...

  3. BSOJ3760||洛谷P1453 城市环路 题解

    城市环路 Description 一座城市,往往会被人们划分为几个区域,例如住宅区.商业区.工业区等等.B市就被分为了以下的两个区域——城市中心和城市郊区.在着这两个区域的中间是一条围绕B市的环路,环 ...

  4. 从零开始编写自己的C#框架(12)——T4模板在逻辑层中的应用(一)(附源码)

    对于T4模板很多朋友都不太熟悉,它在项目开发中,会帮我们减轻很大的工作量,提升我们的开发效率,减少出错概率.所以学好T4模板的应用,对于开发人员来说是非常重要的. 园子里对于T4模板的介绍与资料已经太 ...

  5. T4 分配时间 题解

    问题描述 小王参加的考试是几门科目的试卷放在一起考,一共给 t 分钟来做.他现在已经知道每 门科目花的时间和得到的分数的关系,还有写名字要的时间(他写自己的名字很慢)请帮他 算一下他最高能得几分.总分 ...

  6. luogu P4842 城市旅行

    嘟嘟嘟 好题,好题 刚开始突发奇想写了一个\(O(n ^ 2)\)暴力,结果竟然过了?!后来才知道是上传题的人把单个数据点开成了10s-- 不过不得不说我这暴力写的挺好看的.删边模仿链表删边,加边的时 ...

  7. 网络流24(san)题题解汇总

    开坑(烂尾预定 1.餐巾计划问题 题解 2.最小路径覆盖问题 题解 3.试题库问题 题解 4.[CTSC1999]家园 题解 5.骑士共存问题 题解 6.最长不下降子序列问题 题解 7.深海机器人问题 ...

  8. 2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色

    2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 数据结构学傻的做法: 对每种颜色开动态开点线段树直接维 ...

  9. Tesla T4视频编码性能分析

    Tesla T4视频编码性能分析 从开普勒开始的所有 NVIDIA GPUs 都支持完全加速的硬件视频编码: GPUs 支持完全加速的硬件视频解码.最近发布的图灵硬件提供了张量核心和更好的机器学习性能 ...

随机推荐

  1. Powershell 脚本输出前十条消耗内存的进程到excel

    # create new excel instance $objExcel = New-Object -comobject Excel.Application $objExcel.Visible = ...

  2. django F和Q 关键字使用

    F 的使用: 想给表里每个价格加上一百就要用上F,直接加是不行的.

  3. Java基础语法—数据输入

    我们可以通过 Scanner 类来获取用户的输入.使用步骤如下: 1.导包.Scanner 类在java.util包下,所以需要将该类导入.导包的语句需要定义在类的上面. import java.ut ...

  4. 第六周课程总结&实验报告

    一.实验目的 (1)掌握类的继承 (2)变量的继承和覆盖,方法的继承,重载和覆盖的实现: 二.实验的内容 (1)根据下面的要求实现圆类Circle. 1.圆类Circle的成员变量:radius表示圆 ...

  5. java版微信支付/查询/撤销

    最近公司接入微信刷卡支付,网上根本没见到很直接的教程(可能眼拙),一直摸滚打爬,加班加点才走通,忍不了必须写一写 微信 刷卡支付/查询/撤销... 必须要有公众号然后去申请,申请自己去看文档,这里主要 ...

  6. [2019沈阳网络赛D题]Dawn-K's water(点分治)

    题目链接 题意为求出树上任意点对的距离对3取余的和. 比赛上听到题意就知道是点分治了,但是越写越不对劲,交之前就觉得会T,果不其然T了.修修改改结果队友写了发dp直接就过了Orz. 赛后想了想维护的东 ...

  7. 用nopcomerce3.8版本的同行注意了,前2天发布3.8正式版后,作者收到一些BuG,作者修复后重新提供了一个源代码包下载.

    用nopcomerce3.8版本的同行注意了,前2天发布3.8正式版后,作者收到一些BuG,作者修复后重新提供了一个源代码包下载地址,不是github上的那个链接.去作者官网论坛我那个链接地址,或关注 ...

  8. 分布式锁实现方式介绍和Zookeeper实现原理

    分布式锁实现的几种方式 基于数据库实现分布式锁(表.数据库排他锁) 基于缓存(redis,memcached,tair) 基于Zookeeper实现分布式锁 关注点: 单点问题?(集群) 失效时间?( ...

  9. [七月挑选]Tomcat使用命令行启动之指定jdk版本

    title: Tomcat使用命令行启动之指定jdk版本 准备好环境,jdk和tomcat. 主要步骤 1.找到Tomcat/bin/catalina.bat文件. 2.在文件前端添加如下. set ...

  10. NSPredicate的使用,超级强大

    NSPredicate *ca = [NSPredicate predicateWithFormat:(NSString *), ...]; Format: (1)比较运算符>,<,==, ...