题意: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. 系统常量对话框QT实现

    1.运行结果: 2.代码 main.cpp #include "constantdiag.h" #include <QtWidgets/QApplication> in ...

  2. 深入理解Java对象序列化(转载)

    原文地址:http://developer.51cto.com/art/201202/317181.htm 1. 什么是Java对象序列化 Java平台允许我们在内存中创建可复用的Java对象,但一般 ...

  3. Git命令基本操作

    本文从以下九个方面,介绍Git命令的基本操作: 一. Git安装 二. Git基本配置 三. 创建Git仓库 四. 获得Git仓库 五. 提交更新 六. 提交历史查看 七. 远程仓库 八. 打Tags ...

  4. 【Linux】- Ubuntu安装redis,并开启远程访问

    Ubuntu16.04安装Redis 开启Redis远程访问的步骤: 1.注释掉redis配置文件中的,bind 127.0.0.1 sudo vi /etc/redis/redis.conf #注释 ...

  5. ASP.NET MVC下使用文件上传和IIS7下的默认设置限制了上传大小的方法

    不多说了,直接用别人的 http://www.cnblogs.com/jiekzou/p/4491505.html

  6. 【bzoj1572】[Usaco2009 Open]工作安排Job 贪心+堆

    题目描述 Farmer John 有太多的工作要做啊!!!!!!!!为了让农场高效运转,他必须靠他的工作赚钱,每项工作花一个单位时间. 他的工作日从0时刻开始,有1000000000个单位时间(!). ...

  7. BZOJ4869 六省联考2017相逢是问候(线段树+欧拉函数)

    由扩展欧拉定理,a^(a^(a^(……^x)))%p中x作为指数的模数应该是φ(φ(φ(φ(……p)))),而p取log次φ就会变为1,也即每个位置一旦被修改一定次数后就会变为定值.线段树维护区间剩余 ...

  8. vue-cli项目打包出现空白页和路径错误问题

    vue-cli项目打包: 1. 命令行输入:npm  run  build 打包出来后项目中就会多了一个文件夹dist,这就是我们打包过后的项目. 第一个问题,文件引用路径.我们直接运行打包后的文件夹 ...

  9. C# 类反射创建对象实例

    object obj= Activator.CreateInstance(Type  type);

  10. [SOJ #48]集合对称差卷积

    题目大意:给你两个多项式$A,B$,求多项式$C$使得: $$C_n=\sum\limits_{x\oplus y=n}A_xB_y$$题解:$FWT$ 卡点:无 C++ Code: #include ...