最近学的图论,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 过路费的更多相关文章

  1. 【Usaco 2009 Gold】JZOJ2020年9月19日提高B组T4 过路费

    [Usaco 2009 Gold]JZOJ2020年9月19日提高B组T4 过路费 题目 Description 跟所有人一样,农夫约翰以着宁教我负天下牛,休叫天下牛负我的伟大精神,日日夜夜苦思生财之 ...

  2. USACO 2009 Open 干草塔 Tower of Hay

    USACO 2009 Open 干草塔 Tower of Hay Description 为了调整电灯亮度,贝西要用干草包堆出一座塔,然后爬到牛棚顶去把灯泡换掉.干草 包会从传送带上运来,共会出现N包 ...

  3. USACO 2009 Feb 股票市场 Stock Market

    USACO 2009 Feb 股票市场 Stock Market Description 尽管奶牛们天生谨慎,她们仍然在住房抵押信贷市场中大受打击,现在她们准备在股市 上碰碰运气.贝西开挂了,她知道S ...

  4. 【Usaco 2009 Gold】JZOJ2020年9月19日提高B组T3 头晕的奶牛

    [Usaco 2009 Gold]JZOJ2020年9月19日提高B组T3 头晕的奶牛 题目 Description 奶牛们发现,在农场里面赛跑是很有趣的一件事.可是她们一旦在农场里面不断地转圈,就会 ...

  5. 【Usaco 2009 Gold 】JZOJ2020年9月19日提高B组T2 电视游戏问题

    [Usaco 2009 Gold ]JZOJ2020年9月19日提高B组T2 电视游戏问题 题目 Description 农夫约翰的奶牛们游戏成瘾!本来FJ是想要按照陶叫兽的做法拿她们去电击戒瘾的,可 ...

  6. 【Usaco 2009 Silver】JZOJ2020年9月19日提高B组T1 音乐节拍

    [Usaco 2009 Silver]JZOJ2020年9月19日提高B组T1 音乐节拍 题目 Description FJ准备教他的奶牛弹奏一首歌曲,歌曲由N(1<=N<=50,000) ...

  7. NC24840 [USACO 2009 Mar S]Look Up

    NC24840 [USACO 2009 Mar S]Look Up 题目 题目描述 Farmer John's N (1 <= N <= 100,000) cows, convenient ...

  8. 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 ...

  9. USACO 2009 Dec cow toll paths 过路费-floyd

    这道题首先要明确一点,那就是当你从一个点走到自己时,也是需要花费这个点点权值的费用.这个点卡了我两次QWQ 然后我比较喜欢分两步搞: 首先,我们利用floyd的一个性质:就是在更新其他点之间的路线时要 ...

随机推荐

  1. Android之提示Toast

    步骤: 设置监听事件步骤1.事件源,如按键 btn_simple2.事件 OnClick3.监听器new OnClickListener3.绑定事件源与事件 setOnClickListener(ne ...

  2. OleDbCommand使用参数应该注意的地方

    最近写程序用到OleDbCommand的Parameter写数据库,遇到很多问题: 1.OLE DB .NET Framework 数据提供程序和 ODBC .NET Framework 数据提供程序 ...

  3. 前端工程构建工具——Yeoman

    一.Yeoman 简介 通常在开发新项目时我们都需要配置工程环境,开发目录,需要下载一些库.框架文件(如 jQuery.Backbone 等),配置编译环境(Less.Sass.Coffeescrip ...

  4. iptable filter nat MASQUERADE snat dat

    在这里,系统会根据IP数据包中的destination ip address中的IP地址对数据包进行分发.如果destination ip adress是本机地址,数据将会被转交给INPUT链.如果不 ...

  5. 转载:【Oracle 集群】RAC知识图文详细教程(九)--RAC基本测试与使用

    文章导航 集群概念介绍(一) ORACLE集群概念和原理(二) RAC 工作原理和相关组件(三) 缓存融合技术(四) RAC 特殊问题和实战经验(五) ORACLE 11 G版本2 RAC在LINUX ...

  6. windows下使用python的scrapy爬虫框架,爬取个人博客文章内容信息

    scrapy作为流行的python爬虫框架,简单易用,这里简单介绍如何使用该爬虫框架爬取个人博客信息.关于python的安装和scrapy的安装配置请读者自行查阅相关资料,或者也可以关注我后续的内容. ...

  7. 网站微信登录-python 实现

    最近微信登录开放公测,为了方便微信用户使用,我们的产品也决定加上微信登录功能,然后就有了这篇笔记. 根据需求选择相应的登录方式 微信现在提供两种登录接入方式 移动应用微信登录 网站应用微信登录 这里我 ...

  8. Unix网络编程第三版源码编译

    配置: $ cd Unix-Network-Programming/ $ chmod 755 configure $ ./configure 主要的工作是检查系统是否有源码编译所依赖的各种资源(系统版 ...

  9. I.MX6 Manufacturing Tool V2 (MFGTool2) Emmc mksdcard.sh hacking

    #!/bin/sh # 参考文章: # . MFGTool Emmc mksdcard.sh MFGTool Emmc mksdcard.sh comment # http://jordonwu.gi ...

  10. 【idea】如何彻底卸载idea

    卸载MAC中的IDEA Intellij 14 使用命令行: 1 2 3 4 5 6 cd /Applications/ rm -r IntelliJ\ IDEA\ 14.app/ rm -r /Us ...