题意:n个点,m条双向边,每个点有权值c[i],每条边有权值a[i].d,一条路径的费用=每条边的权值和+各个点的权值的最大值,即sigma(a[i].d)+max(c[i])。q个询问,问x到y的最小费用。n<=250,m<=10000.

题解:

 for(int k=;k<=n;k++)
{
int x=p[k].id;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
{
int t0=maxx(w[i],w[x]),t1=maxx(w[x],w[j]);
dis[i][j]=minn(dis[i][j],dis[i][x]+dis[x][j]-t0-t1+maxx(t0,t1));
}
}

点按ci排序,k循环按点从小到达循环,floyd的三重循环中,k限定了当前任意的i到j的最短路径都是由1~k所更新的,也就是i到j的路径中不经过c[x]>c[k]的点。所以我们可以知道当前更新dis[i][j]的dis[i][k]和dis[k][j]这两条路径中点权的最大值分别是什么。

 #include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
#include<cmath>
#include<deque>
using namespace std; const int N=,INF=(int)1e9;
int n,m,Q;
int w[N],dis[N][N];
struct node{
int id,d;
}p[N]; int minn(int x,int y){return x<y ? x:y;}
int maxx(int x,int y){return x>y ? x:y;}
bool cmp(node x,node y){return x.d<y.d;} void floyd()
{
for(int k=;k<=n;k++)
{
int x=p[k].id;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
{
int t0=maxx(w[i],w[x]),t1=maxx(w[x],w[j]);
dis[i][j]=minn(dis[i][j],dis[i][x]+dis[x][j]-t0-t1+maxx(t0,t1));
}
}
} int main()
{
// freopen("a.in","r",stdin);
freopen("toll.in","r",stdin);
freopen("toll.out","w",stdout);
scanf("%d%d%d",&n,&m,&Q);
int x,y,d;
for(int i=;i<=n;i++)
{
scanf("%d",&w[i]);
p[i].id=i;p[i].d=w[i];
}
sort(p+,p++n,cmp);
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
{
if(i==j) dis[i][j]=w[i];
else dis[i][j]=INF;
}
for(int i=;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&d);
dis[x][y]=minn(dis[x][y],d+maxx(w[x],w[y]));
dis[y][x]=minn(dis[y][x],d+maxx(w[x],w[y]));
}
floyd();
// for(int i=1;i<=n;i++)
// for(int j=1;j<=n;j++)
// printf("dis %d %d = %d\n",i,j,dis[i][j]);
for(int i=;i<=Q;i++)
{
scanf("%d%d",&x,&y);
printf("%d\n",dis[x][y]);
}
return ;
}

【bzoj1774-过路费】floyd+排序的更多相关文章

  1. bzoj 1774: [Usaco2009 Dec]Toll 过路费【排序+Floyd】

    非常迷的一道题啊 我觉得挺对的版本只得了30 总之就是Floyd·改,开两个数组,一个是d[i][j]就是普通的只有边权的最短路,a[i][j]是题目要求的那种 具体改的地方是把枚举中转点的地方把中转 ...

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

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

  3. Floyd | | jzoj[1218] | | [Usaco2009 Dec]Toll 过路费 | | BZOJ 1774 | | 我也不知道该怎么写

    写在前面:老师说这一道题是神题,事实上确实如此,主要是考察对Floyd的理解 ******************************题目.txt************************* ...

  4. BZOJ1774[USACO 2009 Dec Gold 2.Cow Toll Paths]——floyd

    题目描述 跟所有人一样,农夫约翰以着宁教我负天下牛,休叫天下牛负我的伟大精神,日日夜夜苦思生 财之道.为了发财,他设置了一系列的规章制度,使得任何一只奶牛在农场中的道路行走,都 要向农夫约翰上交过路费 ...

  5. bzoj 1774: [Usaco2009 Dec]Toll 过路费 ——(改)floyd

    Description 跟所有人一样,农夫约翰以着宁教我负天下牛,休叫天下牛负我的伟大精神,日日夜夜苦思生 财之道.为了发财,他设置了一系列的规章制度,使得任何一只奶牛在农场中的道路行走,都 要向农夫 ...

  6. [ACM_模拟] POJ 1094 Sorting It All Out (拓扑排序+Floyd算法 判断关系是否矛盾或统一)

    Description An ascending sorted sequence of distinct values is one in which some form of a less-than ...

  7. POJ3687 Labeling Balls(拓扑排序\贪心+Floyd)

    题目是要给n个重量1到n的球编号,有一些约束条件:编号A的球重量要小于编号B的重量,最后就是要输出字典序最小的从1到n各个编号的球的重量. 正向拓扑排序,取最小编号给最小编号是不行的,不举出个例子真的 ...

  8. Sorting It All Out (拓扑排序+floyd)

    An ascending sorted sequence of distinct values is one in which some form of a less-than operator is ...

  9. 拓扑排序 +Floyd(poj 1094)

    题目:Sorting It All Out 题意:字母表前n个字母,有m组他们中的大小关系,判断n个字母是否构成唯一序列: 1.Sorted sequence determined after xxx ...

随机推荐

  1. BluetoothServerSocket详解

    一. BluetoorhServerSocket简介 1. 继承关系 public final class BluetoothServerSocket extends Object implement ...

  2. Internet History

    Alan Turing and Bletchley Park Top secret breaking effort(二战破译希特勒密码) 10,000 people at the peak(team ...

  3. 团队选题报告(i know)

    一.团队成员及分工 团队名称:I know 团队成员: 陈家权:选题报告word撰写 赖晓连:ppt制作,原型设计 雷晶:ppt制作,原型设计 林巧娜:原型设计,博客随笔撰写 庄加鑫:选题报告word ...

  4. java中 i = i++和 j = i++ 的区别

    由于i++和i--的使用会导致值的改变,所以在处理后置的++和--的时候,java的编译器会重新为变量分配一块新的内存空间,用来存放原来的值, 而完成赋值运算之后,这块内存会被释放. (1)对于j = ...

  5. 转 高性能IO模型浅析

    高性能IO模型浅析 转自:http://www.cnblogs.com/fanzhidongyzby/p/4098546.html 服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: ( ...

  6. lol人物模型提取(六)

      模型昨天就已经做出来了,不过到上色这一块貌似又遇到了一些问题.由于模型的眼睛比较小,没法做出亮光效果,上不了UV,只能做哑光效果的.   亮光效果:   哑光效果:   很显然亮光效果更加好看一点 ...

  7. Maximum execution time of 30 seconds exceeded解决办法

    Maximum execution time of 30 seconds exceeded,今天把这个错误的解决方案总结一下: 简单总结一下解决办法: 报错一:内存超限,具体报错语句忘了,简单说一下解 ...

  8. 【重读MSDN之ADO.NET】ADO.NET连接

    连接到ADO.NET中的数据源 在 ADO.NET 中,通过在连接字符串中提供必要的身份验证信息,使用 Connection 对象连接到特定的数据源.使用的 Connection 对象取决于数据源的类 ...

  9. 微信抢红包软件-android

    微信红包不错的分析: 附带源码 并包含了源码 参考: Android中微信抢红包助手的实现 (1) https://www.jianshu.com/p/19ddd41aa349 (2) http:// ...

  10. asp.net mvc4使用log4.net 日志功能

    对于网站来讲,不能把异常信息显示给用户,异常信息只能记录到日志,出了问题把日志文件发给开发人员,就能知道问题所在. 下面演示网站 出错后自动添加出错日志的实例 (1)新建一个WebApplicatio ...