usaco 2009 12 过路费
最近学的图论,oj上的这道题卡了我一上午,写一下总结。
题目描述:
跟所有人一样,农夫约翰以着宁教我负天下牛,休教天下牛负我(原文:宁我负人,休教人负我)的伟大精神,日日夜夜苦思生财之道。为了发财,他设置了一系列的规章制度,使得任何一只奶牛在农场中的道路行走,都要向农夫约翰上交过路费。
农场中由N(1
<= N <= 250)片草地(标号为1到N),并且有M(1 <= M <= 10000)条双向道路连接草地A_j和B_j(1
<= A_j <= N; 1 <= B_j <=
N)。奶牛们从任意一片草地出发可以抵达任意一片的草地。FJ已经在连接A_j和B_j的双向道路上设置一个过路费L_j(1 <= L_j <=
100,000)。
可能有多条道路连接相同的两片草地,但是不存在一条道路连接一片草地和这片草地本身。最值得庆幸的是,奶牛从任意一篇草地出发,经过一系列的路径,总是可以抵达其它的任意一片草地。
除了贪得无厌,宁智贤都不知道该说什么好。FJ竟然在每片草地上面也设置了一个过路费C_i(1
<= C_i <=
100000)。从一片草地到另外一片草地的费用,是经过的所有道路的过路费之和,加上经过的所有的草地(包括起点和终点)的过路费的最大值。
任劳任怨的牛们希望去调查一下她们应该选择那一条路径。她们要你写一个程序,接受K(1
<= K <= 10,000)个问题并且输出每个询问对应的最小花费。第i个问题包含两个数字s_i和t_i(1 <= s_i <= N;
1 <= t_i <= N; s_i != t_i),表示起点和终点的草地。
考虑下面这个包含5片草地的样例图像:
从草地1到草地2的道路的“边过路费”为3,草地2的“点过路费”为5。
要从草地1走到草地4,可以从草地1走到草地3再走到草地5最后抵达草地4。如果这么走的话,
需要的“边过路费”为2+1+1=4,需要的点过路费为4(草地5的点过路费最大),所以总的花
费为4+4=8。
而从草地2到草地3的最佳路径是从草地2出发,抵达草地5,最后到达草地3。这么走的话,边
过路费为3+1=4,点过路费为5,总花费为4+5=9。
输入格式:
* 第1行: 三个空格隔开的整数: N, M和K
* 第2到第N+1行: 第i+1行包含一个单独的整数: C_i
* 第N+2到第N+M+1行:
第j+N+1行包含3个由空格隔开的整数: A_j, B_j和L_j
* 第N+M+2倒第N+M+K+1行:
第i+N+M+1行表示第i个问题,包含两个由空格隔开的整数s_i和t_i
输出格式:
* 第1到第K行: 第i行包含一个单独的整数,表示从s_i到t_i的最小花费。
输入样例:
5 7 2
2
5
3
3
4
1 2 3
1 3 2
2 5 3
5 3 1
5 4 1
2 4 3
3 4 4
1 4
2 3
输出样例:
8
9
刚开始看到数据范围就只有250个点,很明显Floyd可以过,但是又想到写过了好几道的Floyd了,然后就想尝试一下写SPFA试试挑战一下,结果......呵呵,智障的我写了一上午,,其实思路都对的,但是估计是自己对Floyd的工作原理理解的还不是非常的透彻,所以写不出来。
思路:
很明显是一道求最短路的问题,但是加上了点的费用,这是最坑的(其实也挺好写)。无非就是每次迭代的时候把起点,转折点,终点的点值比较一下,选最大的就行了(但是不知道为什么SPFA就是写不出来)。
代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std; const int maxn=;
int dis[][],w[],g[][],n,m,k;
struct f
{
int v,id;
}dian[]; bool pan(f a,f b)
{
return a.v<b.v;
} void init()
{
cin>>n>>m>>k;
for(int i=;i<=n;i++)
{
cin>>dian[i].v;
dian[i].id=i;
w[i]=dian[i].v;
}
sort(dian+,dian+n+,pan);
memset(dis,,sizeof(dis));
memset(g,,sizeof(g));
for(int i=;i<=m;i++)
{
int x,y,v;
cin>>x>>y>>v;
if(v<dis[x][y])
dis[x][y]=v;
if(v<dis[y][x])
dis[y][x]=v;
}
} void floyed()
{
for(int i=;i<=n;i++)
g[i][i]=dian[i].v;
for(int t=;t<=n;t++)
{
int k=dian[t].id;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
{
dis[i][j]=dis[j][i]=min(dis[i][k]+dis[k][j],dis[i][j]);
g[i][j]=g[j][i]=min(g[i][j],dis[i][j]+max(dian[t].v,max(w[i],w[j])));
}
}
} int main()
{
freopen("add.in","r",stdin);
freopen("add.out","w",stdout);
memset(dis,,sizeof(dis));
memset(dian,,sizeof(dian));
for(int i=;i<=n;i++) dis[i][i]=;
init();
floyed();
for(int i=;i<=k;i++)
{
int st,ed;
cin>>st>>ed;
cout<<g[st][ed]<<endl;
}
fclose(stdin);fclose(stdout);
return ;
}
usaco 2009 12 过路费的更多相关文章
- 【Usaco 2009 Gold】JZOJ2020年9月19日提高B组T4 过路费
[Usaco 2009 Gold]JZOJ2020年9月19日提高B组T4 过路费 题目 Description 跟所有人一样,农夫约翰以着宁教我负天下牛,休叫天下牛负我的伟大精神,日日夜夜苦思生财之 ...
- USACO 2009 Open 干草塔 Tower of Hay
USACO 2009 Open 干草塔 Tower of Hay Description 为了调整电灯亮度,贝西要用干草包堆出一座塔,然后爬到牛棚顶去把灯泡换掉.干草 包会从传送带上运来,共会出现N包 ...
- USACO 2009 Feb 股票市场 Stock Market
USACO 2009 Feb 股票市场 Stock Market Description 尽管奶牛们天生谨慎,她们仍然在住房抵押信贷市场中大受打击,现在她们准备在股市 上碰碰运气.贝西开挂了,她知道S ...
- 【Usaco 2009 Gold】JZOJ2020年9月19日提高B组T3 头晕的奶牛
[Usaco 2009 Gold]JZOJ2020年9月19日提高B组T3 头晕的奶牛 题目 Description 奶牛们发现,在农场里面赛跑是很有趣的一件事.可是她们一旦在农场里面不断地转圈,就会 ...
- 【Usaco 2009 Gold 】JZOJ2020年9月19日提高B组T2 电视游戏问题
[Usaco 2009 Gold ]JZOJ2020年9月19日提高B组T2 电视游戏问题 题目 Description 农夫约翰的奶牛们游戏成瘾!本来FJ是想要按照陶叫兽的做法拿她们去电击戒瘾的,可 ...
- 【Usaco 2009 Silver】JZOJ2020年9月19日提高B组T1 音乐节拍
[Usaco 2009 Silver]JZOJ2020年9月19日提高B组T1 音乐节拍 题目 Description FJ准备教他的奶牛弹奏一首歌曲,歌曲由N(1<=N<=50,000) ...
- NC24840 [USACO 2009 Mar S]Look Up
NC24840 [USACO 2009 Mar S]Look Up 题目 题目描述 Farmer John's N (1 <= N <= 100,000) cows, convenient ...
- NC24866 [USACO 2009 Dec S]Music Notes
NC24866 [USACO 2009 Dec S]Music Notes 题目 题目描述 FJ is going to teach his cows how to play a song. The ...
- USACO 2009 Dec cow toll paths 过路费-floyd
这道题首先要明确一点,那就是当你从一个点走到自己时,也是需要花费这个点点权值的费用.这个点卡了我两次QWQ 然后我比较喜欢分两步搞: 首先,我们利用floyd的一个性质:就是在更新其他点之间的路线时要 ...
随机推荐
- JavaScript里Math对象的ceil()、floor()、round()方法的区别
ceil(x) 官方含义:对一个数进行上舍入.理解:ceiling为天花板的意思,意译为向上取整.即取得大于于等于x的最大整数. floor(x) 官方含义:对一个数进行下舍入.理解:floor为地板 ...
- auth权限认证详细讲解
auth权限认证详细讲解 一.总结 一句话总结:四表两组关系,一个多对多(权限和用户组之间)(多对多需要3个表),一个一对多(用户和用户组之间) 1.实际上使用Auth是需要4张表的(1.会员表 2. ...
- Spring的JdbcTemplate实现分页
PageList.java实体类 /** * 封装分页对象 **/ public class PageList { private int page; //当前页 private int totalR ...
- 使用POI导入小数变成浮点数异常
例如 我在Excel中的数据为17.2, 导入到表中就变成了17.1999999或者17.20000001 原因是我用double接收了17.2,然后直接用了String去转换,精度就丢失了. 代 ...
- 无法安装64位版本的office因为在您的pc
无法安装64位版本的office因为在您的pcWindows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\Installer\Products\00 ...
- FZU 2169 shadow spfa
题目链接:shadow 好佩服自己耶~~~好厉害~~~ 麻麻再也不用担心我的spfa 和 邻接表技能了~~~ spfa 记录最短路径. #include <stdio.h> #includ ...
- activity+fragment+listview+adapter+bean在同一个类中的套路
1.xml activity_main.xml <?xml version="1.0" encoding="utf-8"?><FrameLay ...
- LocalStorage漏洞分析
之前LocalStorage爆出过一个漏洞,使用Chrome打开这个网站:http://filldisk.com,会将磁盘空间给撑爆,而且Chrome还会Crash.除了FireFox之外,其他浏览器 ...
- 谈谈我对"闭包"的理解
一.什么是闭包和闭包的几种写法和用法 1.什么是闭包闭包,官方对闭包的解释是:一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分.闭包的特点: 1. 作 ...
- Java第七次作业--图形用户界面
Deadline: 2017-5-11 23:00 一.学习要点 认真看书并查阅相关资料,掌握以下内容: 了解GUI开发的相关原理和技巧 熟悉Swint组件的使用 理解事件处理模型 二.作业要求 发布 ...