非常迷的一道题啊

我觉得挺对的版本只得了30

总之就是Floyd·改,开两个数组,一个是d[i][j]就是普通的只有边权的最短路,a[i][j]是题目要求的那种

具体改的地方是把枚举中转点的地方把中转点按从小到大的顺序枚举,d[i][j]按照套路更新即可,然后a[i][j]从a[i][j]原数和d[i][j]+max(c[i],c[j],c[中转点])中取min

证明的话是最短路不一定是最终答案,能更新这个答案的一定是最大点更小一些的另一条路,所以按点权顺序更新能保证把这种情况全部更新

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=255,inf=1e9+7;
int n,m,q,a[N][N],d[N][N],v[N];
struct qwe
{
int p,v;
}c[N];
bool cmp(const qwe &x,const qwe &y)
{
return x.v<y.v;
}
int read()
{
int r=0,f=1;
char p=getchar();
while(p>'9'||p<'0')
{
if(p=='-')
f=-1;
p=getchar();
}
while(p>='0'&&p<='9')
{
r=r*10+p-48;
p=getchar();
}
return r*f;
}
int main()
{
n=read(),m=read(),q=read();
for(int i=1;i<=n;i++)
v[i]=d[i][i]=a[i][i]=c[i].v=read(),c[i].p=i;
sort(c+1,c+1+n,cmp);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(i!=j)
a[i][j]=d[i][j]=inf;
for(int i=1;i<=m;i++)
{
int x=read(),y=read(),z=read();
d[x][y]=d[y][x]=min(d[x][y],z);
}
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
d[i][j]=min(d[i][j],d[i][c[k].p]+d[c[k].p][j]),a[i][j]=min(a[i][j],d[i][j]+max(max(v[i],v[j]),c[k].v));
while(q--)
{
int x=read(),y=read();
printf("%d\n",a[x][y]);
}
return 0;
}

我觉得挺对的版本:

#include<iostream>
#include<cstdio>
using namespace std;
const int N=255,inf=1e9+7;
int n,m,q,a[N][N],c[N],mx[N][N];
int read()
{
int r=0,f=1;
char p=getchar();
while(p>'9'||p<'0')
{
if(p=='-')
f=-1;
p=getchar();
}
while(p>='0'&&p<='9')
{
r=r*10+p-48;
p=getchar();
}
return r*f;
}
int main()
{
n=read(),m=read(),q=read();
for(int i=1;i<=n;i++)
c[i]=read(),mx[i][i]=a[i][i]=c[i];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(i!=j)
a[i][j]=mx[i][j]=inf;
for(int i=1;i<=m;i++)
{
int x=read(),y=read(),z=read();
if(a[x][y]>z+max(c[x],c[y]))
a[x][y]=a[y][x]=z+max(c[x],c[y]),mx[x][y]=mx[y][x]=max(c[x],c[y]);
}
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(a[i][j]>a[i][k]-mx[i][k]+a[k][j]-mx[k][j]+max(mx[i][k],mx[k][j]))
a[i][j]=a[i][k]-mx[i][k]+a[k][j]-mx[k][j]+max(mx[i][k],mx[k][j]),mx[i][j]=max(mx[i][k],mx[k][j]);
while(q--)
{
int x=read(),y=read();
printf("%d\n",a[x][y]);
}
return 0;
}

bzoj 1774: [Usaco2009 Dec]Toll 过路费【排序+Floyd】的更多相关文章

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

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

  2. [bzoj 1774][Usaco2009 Dec]Toll 过路费

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

  3. 1774: [Usaco2009 Dec]Toll 过路费

    1774: [Usaco2009 Dec]Toll 过路费 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 263  Solved: 154[Submit ...

  4. 【BZOJ】1774: [Usaco2009 Dec]Toll 过路费

    [题意]给定无向图,距离定义为边权和+最大点权,询问若干个两点最短距离.n<=250. [算法]排序+floyd [题解]考虑floyd的过程是每次找一个中转点,为了在当前找到一条新路径时方便地 ...

  5. BZOJ_1774_[Usaco2009 Dec]Toll 过路费_floyd

    BZOJ_1774_[Usaco2009 Dec]Toll 过路费_floyd 题意: 跟所有人一样,农夫约翰以着宁教我负天下牛,休叫天下牛负我的伟大精神,日日夜夜苦思生 财之道.为了发财,他设置了一 ...

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

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

  7. [Usaco2009 Dec]Toll 过路费

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

  8. [bzoj1774] [Usaco2009 Dec]Toll 过路费

    Floyd神用法...设dis[i][j]表示i点到j点的最短路(只算边权),map[i][j]表示i到j最小费用 将n个点先按照点权排一下序...这样就可以比较方便的求出路径上最大点权了... 因为 ...

  9. BZOJ 3412: [Usaco2009 Dec]Music Notes乐谱(离线处理)

    这道题貌似怎么写都可以吧= =,我先读入询问然后从小到大处理就行了= = PS:水水题真的好!无!聊!但是好!欢!乐! CODE: #include<cstdio>#include< ...

随机推荐

  1. Shader Wave

    Shader Wave 一.原理 1. 采用 UV 坐标为原始数据,生成每一条波浪线. 2. 使用 Unity 的 Time.y 作为时间增量,动态变换波形. 二.操作步骤 1. 首先使用纹理坐标生成 ...

  2. Xcode报referenced from错误的总结

    一.库文件丢失 如果提示的文件是库文件,比如说是sdk的文件,有可能是就是丢失,或者没有引用到该工程. 1.点击这个.a库,或者framework,看右边的target里面是否引用到了当前的targe ...

  3. java手工从键盘输入数字存放到数组并将其输出

    package suanfafenxi; import java.util.Scanner; public class shiyan { static int number=10; static in ...

  4. hdu 1179最大匹配

    #include<stdio.h> #include<string.h> #define N 200 int map[N][N],visit[N],link[N],n,m; i ...

  5. CentOS虚拟机与本机同步时间

    接着之前的任务,还是为了在VMWare上搭建分布式hadoop集群.搭着搭着注意到虚拟机上的时间和本机是不同步的,而且可以说是乱七八糟,3台虚拟机时间都与本机差了8个小时以上.首先确认不是时区的问题, ...

  6. Redis2019年3.22

    redis缓存技术学习 一. redis基础配置 1. redis简介 1.1 redis 是c语言编写的一个缓存服务器, 是一个内存版本的nosql非关系型数据,大概11w/s访问处理. 数据都在本 ...

  7. cogs 48. [NOIP2007] 字符串的展开

    48. [NOIP2007] 字符串的展开 ★☆   输入文件:expand.in   输出文件:expand.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述] 在初赛普 ...

  8. 上下文( Contexts )

    在 Indy9 的服务器中,链接特定(connection specific)的数据被作为线程类的一部分被存储. 实现这个要不然通过使用 thread.data 属性要不然通过继承对应的 thread ...

  9. CSS3的animation功能

    旋转动画 <img src="https://facebook.github.io/react/img/logo.svg" class="App-logo" ...

  10. tplink wr886n v5.0 ttl 接线方法

    我的倒是有ttl信息,但是全是乱码,换过RX和TX,也换过串口速率都没用,附上TTL接线图. ==================================2016-11-02========= ...