声音(sound)

【问题描述】
雅礼中学的校门口在修建地铁,而由此带来的噪音问题让周边的居民困扰不已。环保局正在研究 一项评估模型,可以定量评价噪音的危害程度。这项评估模型是这样的:将每一条街道视作一条 无向边,而路口,也就是街道间的交叉口视作一个结点。给每 条街道赋予一个数值,表示该街道的平均噪音值。如图,假设 你从路口 A 去路口 G,依次经过 A-C-F-G 这条道路,沿途你需 要忍受的最大噪音值则是 140。而假如你走 A-B-E-G, A-B-D-G 或者 A-C-F-D-G 你需要忍受的最大噪音值则分别是 90, 120, 80。在所有 A 到 G 的路径中,可以验证 A-C-F-D-G 是一条最能 忍受的路径,因为没有比其噪音值 80 更低的路径了。现在给 你附近街道的相关信息,请你求出从一个路口走到另一个路 口,沿途你不得不忍受的最小噪音值。

【输入】
输入包含多组测试点。
每组测试的第 1 行包含三个整数 C (C≤ 100),S (S ≤ 1000) 和 Q (Q ≤ 10000),用空格分隔,其中 C 表 示路口的数量,S 表示街道的数量,Q 表示询问的次数。
接下来的 S 行每行包括 3 个整数,c1, c2 和 d,用空格分隔,分别表示连接 c1 和 c2(c1 != c2)两 个路口的街道的噪音值 d。
接下来的 Q 行每行包括两个整数,c1 和 c2(c1 != c2),用空格分隔,表示询问从路口 c1 走到路 口 c2 不得不忍受的最小噪音值。
输入以 C、S、Q 均为 0 作为结束标志。

【输出】
对于每一个测试点,在第一行输出测试点编号“Case”(从 1 开始),参照样例输出。接下来对于 输入的每一次询问输出一个整数,表示不得不忍受的最小噪声值。如果询问的两个路口并不能相 互到达,则输出“no path”。每两个测试点的输出用一个空白行隔开


考试时傻了,没做出来( @—@ )


思路;

根据Q的规模,我们显然不可能使用在线算法(用得出算你赢)

再联系题目,C的规模为100,大约是n3加上一些常数级别的处理(并查集,二分以及常数优化......),联系本题题面(最短路径问题变式)

关键词的重叠,告诉我们一个重要信息:

 ( 离线 , 最短路 , n3 ) = floyd

所以我们确定了思路,使用floyd解决这道题。


本题目标为求“所有路径中最大边长最小”。于此,我们惯用的方法二分难以使用。所以,我们只能在floyd的条件判断上下功夫。于此,首先,我们要明确目标:最大 的 最小

所以,我们这样写动规方程: f[i][j] = min(f[i][j], max(f[i][k], f[k][j]));

什么意思呢:f[i][j]是 他自己 与 (从i到k与从j到k中更大的那一个)中更小的那一个。

注 :他自己 、(从i到k与从j到k中更大的那一个)中更小的那一个 是对路径而言,所以选最小。

  从i到k 、从j到k 是对边权而言,所以选最小。

至此,核心观点分析完毕。


#include<bits/stdc++.h>
using namespace std;
const int maxn = 100 + 5;
const int inf = 1e9 ;
int f[maxn][maxn];
int main() {
int n , m , q , cnt = 0; freopen("sound.in", "r", stdin);
freopen("sound.out", "w", stdout); while(~scanf("%d%d%d", &n, &m, &q)) {
if(n == 0 && m == 0 && q == 0)return 0; cnt ++;
printf("Case #%d\n", cnt); for(int i = 1; i <= n; i++) {
for(int j = 1; j <= n; j++) {
f[i][j] = inf;
}
} for(int i = 1; i <= m; i++) {
int x, y, z;
scanf("%d%d%d", &x, &y, &z);
f[x][y] = z;
f[y][x] = z;
} for(int i = 1; i <= n; i++) {
f[i][i] = 0;
} for(int k = 1; k <= n; k++) {
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= n; j++) {
f[i][j] = min(f[i][j], max(f[i][k], f[k][j]));
}
}
} for(int i = 1; i <= q; i++) {
int x, y;
cin >> x >> y; if(f[x][y] != inf)
printf("%d\n", f[x][y]);
else
printf("no path\n");
}
} return 0;
}

SRX_Test_2_sound的更多相关文章

随机推荐

  1. C--迷途指针

    简介: 在计算机编程领域中,迷途指针,或称悬空指针.野指针,指的是不指向任何合法的对象的指针. 当所指向的对象被释放或者收回,但是对该指针没有作任何的修改,以至于该指针仍旧指向已经回收的内存地址,此情 ...

  2. 从eclipse迁移到ideal

    个人用eclipse比较多,什么Luna,Neon,Mars.几乎每年都要研发出一个版本.目前所在的这家公司,维护的是一个10年的老项目,需求迭代频率比较高,业务代码臃肿而难理解,依赖关系不清晰,代码 ...

  3. 续 Eureka+Hystrix+Zuul(Zuul API网关)

    概述: 服务的合并,转发,验证,异构协议.将上百个请求融为一个发送到后台,返回大的JSON返回处理: 作用:这减少了客户端与应用程序间的交互次数,还简化了客户端代码. Zuul可以通过加载动态过滤机制 ...

  4. layer弹窗动态改变标题

    1.利用layer弹出iframe层(type=2) 1 function ShowKJCX(results) { 2 ly = layer.open({ 3 type: 2, 4 id:" ...

  5. eclipse之SSH配置hibernate【三】

    配置hibernate,没有和spring整合,可以看成独立的部分. 在src下创建hibernate配置文件,hibernate.cfg.xml.主要是sql连接相关配置. <?xml ver ...

  6. python基础二:循环

    python 中循环的方式有两种: 一,for 循环  单向循环 可以用来遍历字符串,列表,元组,字典等 for value in 被遍历对象: print(value) 遍历字典dict的时候稍有不 ...

  7. Java创建二叉树、二叉树的遍历

    创建二叉树: public class Node {     // 左子节点     public Node leftNode;     // 右子节点     public Node rightNo ...

  8. python实现银行系统模拟程序

    银行系统模拟程序 关注公众号"轻松学编程"了解更多. 1.概述 ​ 使用面向对象思想模拟一个简单的银行系统,具备的功能:管理员登录/注销.用户开户.登录.找回密码.挂失.改密.查询 ...

  9. Charles使用part2——代理设置

    一.charles代理原理: 如果本地开了代理:  二.设置代理 1.设置代理端口: proxy->proxy setting 打开代理设置界面,代理端口默认是 8888,可以使用默认也可以自己 ...

  10. Zookeeper-3.5.8集群搭建

    大数据技术有着众多系统需要分布式协调服务,比如Hadoop.Kafka系统,其中主从切换.维护命名空间.以及分布式协调通知等场景,需要保证数据的分布式一致性. Zookeeper是业界最著名的分布式协 ...