前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >bzoj1774. [Usaco2009 Dec]Toll 过路费 题解

bzoj1774. [Usaco2009 Dec]Toll 过路费 题解

作者头像
yzxoi
发布2022-09-19 11:56:45
2450
发布2022-09-19 11:56:45
举报
文章被收录于专栏:OI

bzoj1774. [Usaco2009 Dec]Toll 过路费 题解

Describe

一句话题意:给你一个有点权n与边权m的图,询问q次,问两个点间最短路长度。(最短路定义为路径上的边权和+路径上的点权的最大值)

1\leq n\leq 250,1\leq m\leq 10000,1\leq q\leq 10000

Solution

考虑到点的数量小于250,所以可以Floyed求出任意两点之间的最短路径长度,记录答案。

由于最短路定义为边权和+点权最大值,所以Floyed枚举的中间点点权应该从小到大。

假设1–>2Sum_d=1,Max_v=7,cost=8,一条Sum_d=4,Max_v=3,cost=7,选择第二条。

假设2–>3Sum_d=3,Max_v=5,cost=8,很容易发现如果一开始选择第一条路的cost=(1+3)+7=11,第二条cost=(4+3)+5=12,很明显,如果一开始选择第一条的话1–>3

Code

代码语言:javascript
复制
#include<bits/stdc++.h>
using namespace std;
inline int read(){int res=0,f=1;char ch=getchar();while(ch<'0'ch>'9'){if(ch=='-') f=-1;ch=getchar();}while(ch>='0'&&ch<='9') res=res*10+ch-'0',ch=getchar();return res*f;}
inline void write(int x){if(x<0) putchar('-'),x=-x;if(x<10) putchar(x+'0');else write(x/10),putchar(x%10+'0');}
int n,m,q,f[255][255],ans[255][255],g[255];
struct node{int v,id;}a[255];
inline int cmp(node x,node y){return x.v<y.v;}
int main(){
n=read(),m=read(),q=read();
for(int i=1;i<=n;i++) a[i].v=read(),a[i].id=i;
memset(f,63,sizeof(f));
memset(ans,63,sizeof(ans));
for(int i=1;i<=n;i++) f[i][i]=ans[i][i]=a[i].v;
for(int x,y,z,i=1;i<=m;i++){
x=read(),y=read(),z=read();
f[x][y]=f[y][x]=min(f[x][y],z);
}
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++) g[a[i].id]=i;
#define mid a[k].id
#define val a[k].v
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
f[i][j]=min(f[i][j],f[i][mid]+f[mid][j]);
ans[i][j]=min(ans[i][j],f[i][j]+max(val,max(a[g[i]].v,a[g[j]].v)));
}
}
}
#undef mid
#undef val
for(int x,y,i=1;i<=q;i++){
x=read(),y=read();
write(ans[x][y]),putchar('\n');
}
return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-05-26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • bzoj1774. [Usaco2009 Dec]Toll 过路费 题解
    • Describe
      • Solution
        • Code
        相关产品与服务
        对象存储
        对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档