洛谷1967 火车运输

2023-11-07 21:08
文章标签 运输 洛谷 火车 1967

本文主要是介绍洛谷1967 火车运输,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目描述

A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路。每一条道路对车辆都有重量限制,简称限重。现在有 q 辆货车在运输货物,
司机们想知道每辆车在不超过车辆限重的情况下,最多能运多重的货物。 输入输出格式 输入格式:

输入文件名为 truck.in。

输入文件第一行有两个用一个空格隔开的整数 n,m,表示 A 国有 n 座城市和 m 条道

路。 接下来 m 行每行 3 个整数 x、 y、 z,每两个整数之间用一个空格隔开,表示从 x 号城市到 y 号城市有一条限重为 z
的道路。意:x 不等于 y,两座城市之间可能有多条道路。

接下来一行有一个整数 q,表示有 q 辆货车需要运货。

接下来 q 行,每行两个整数 x、y,之间用一个空格隔开,表示一辆货车需要从 x 城市运输货物到 y 城市,注意:x 不等于 y。

输出格式:

输出文件名为 truck.out。

输出共有 q 行,每行一个整数,表示对于每一辆货车,它的最大载重是多少。如果货

车不能到达目的地,输出-1。

因为每次要尽量走大的边,所以可以求出来最大生成树,然后在树上倍增求两点之间最小边权即可。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct edge
{int x,y,w;bool operator < (const edge & eee) const{return w>eee.w;}
}a[50010];
int dep[10010],db_min[10010][17],db_to[10010][17],fir[10010],ne[20010],to[20010],w[20010],fa[10010],tot;
bool vis[10010];
void add(int f,int t,int l)
{ne[++tot]=fir[f];fir[f]=tot;to[tot]=t;w[tot]=l;
}
int find(int x)
{if (fa[x]==x) return x;fa[x]=find(fa[x]);return fa[x];
}
void dfs(int u,int fa)
{int i,j,k,v;for (i=fir[u];i;i=ne[i])if (to[i]!=fa){v=to[i];db_to[v][0]=u;db_min[v][0]=w[i];dep[v]=dep[u]+1;dfs(v,u);}
}
int main()
{int i,j,k,m,n,p,q,x,y,z,ans,tem;scanf("%d%d",&n,&m);for (i=1;i<=m;i++)scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].w);sort(a+1,a+m+1);for (i=1;i<=n;i++)fa[i]=i;for (i=1;i<=m;i++)if (find(a[i].x)!=find(a[i].y)){fa[fa[a[i].x]]=fa[a[i].y];add(a[i].x,a[i].y,a[i].w);add(a[i].y,a[i].x,a[i].w);}for (i=1;i<=n;i++)if (!vis[find(i)]){vis[fa[i]]=1;dep[fa[i]]=0;dfs(fa[i],-1);}for (k=1;k<=15;k++)for (i=1;i<=n;i++){db_to[i][k]=db_to[db_to[i][k-1]][k-1];db_min[i][k]=min(db_min[i][k-1],db_min[db_to[i][k-1]][k-1]);}scanf("%d",&q);for (i=1;i<=q;i++){scanf("%d%d",&x,&y);if (find(x)!=find(y)){printf("-1\n");continue;}ans=0x3f3f3f3f;if (dep[y]>dep[x]){tem=y;y=x;x=tem;}for (k=15;dep[x]>dep[y];k--)if (dep[x]-(1<<k)>=dep[y]){ans=min(ans,db_min[x][k]);x=db_to[x][k];}if (x==y){printf("%d\n",ans);continue;}for (k=15;k>=0;k--)if (db_to[x][k]!=db_to[y][k]){ans=min(ans,min(db_min[x][k],db_min[y][k]));x=db_to[x][k];y=db_to[y][k];}ans=min(ans,min(db_min[x][0],db_min[y][0]));printf("%d\n",ans);}
}

这篇关于洛谷1967 火车运输的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/366282

相关文章

基于Spring Boot的火车订票管理系统

你好呀,我是计算机学姐码农小野!如果有相关需求,可以私信联系我。 开发语言:Java 数据库:MySQL 技术:JAVA语言 + Spring Boot框架 工具:IDEA/Eclipse、Navicat、Tomcat 系统展示 首页 管理员界面 用户购票 订单管理 摘要 随着网络技术的不断发展,火车订票管理系统逐渐由传统的线下操作转变为线上服

高精度计算(代码加解析,洛谷p1601,p1303)除法待更新

目录 高精度加法 高精度减法 高精度乘法 高精度加法 我们知道在c++语言中任何数据类型都有一定的表示范围。当两个被加数很大时,正常加法不能得到精确解。在小学,我们做加法都采用竖式方法。那么我们也只需要按照加法进位的方式就能得到最终解。 8 5 6+ 2 5 5-------1 1 1 1 加法进位: c[i] = a[i] + b[i];if(c[i] >=

洛谷 凸多边形划分

T282062 凸多边形的划分 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 先整一个半成品,高精度过两天复习一下补上 #include <iostream>#include <algorithm>#include <set>#include <cstring>#include <string>#include <vector>#include <map>

能量项链,洛谷

解释:  环形dp问题还是考虑将环拉直,可以参考我上一篇文章:环形石子合并 [2 3 5 10 2] 3 5 10 将环拉直,[]内是一个有效的区间,可以模拟吸收珠子的过程,         如[2 3 5] <=>(2,3)(3,5)    2是头,3是中间,5是尾 len >= 3:因为最后[2 10 2]是最小的可以合并的有效区间 len <= n + 1因为[2 3

计算机网络(运输层)

运输层概述 概念 进程之间的通信 从通信和信息处理的角度看,运输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能中的最低层。 当网络的边缘部分中的两个主机使用网络的核心部分的功能进行端到端的通信时,只有位于网络边缘部分的主机的协议栈才有运输层,而网络核心部分中的路由器在转发分组时都只用到三层(到网络层)的功能。 进程之间通信流程 以体系结构的角度来看

洛谷P5490扫描线

0是最小的数字,将一个线段看成一个区间,对于一个矩形,从下扫到上,入边为1,而出边为-1,意思是将这个区间上的所有点加1(区间修改).把线段表示为Line[i],其中记录了l,r,h,tag,左右端点,高度,入边还是出边(1或-1) 那么每次区间修改后不为0的区间它的值可能是1,2,3或者是其它数字,这不好统计,可以将它转化一下,0是不是表示没有被覆盖过的地方,我们只要统计0的个数然后用总长减去

挤牛奶洛谷uasco

题目描述 三个农民每天清晨5点起床,然后去牛棚给3头牛挤奶。第一个农民在300秒(从5点开始计时)给他的牛挤奶,一直到1000秒。第二个农民在700秒开始,在 1200秒结束。第三个农民在1500秒开始2100秒结束。期间最长的至少有一个农民在挤奶的连续时间为900秒(从300秒到1200秒),而最长的无人挤奶的连续时间(从挤奶开始一直到挤奶结束)为300秒(从1200秒到1500秒)。

洛谷刷题(7)

P8738 [蓝桥杯 2020 国 C] 天干地支 题目描述 古代中国使用天干地支来记录当前的年份。 天干一共有十个,分别为:甲(jiǎ)、乙(yǐ)、丙(bǐng)、丁(dīng)、戊 (wù)、己(jǐ)、庚(gēng)、辛(xīn)、壬(rén)、癸(guǐ)。 地支一共有十二个,分别为:子(zǐ)、丑(chǒu)、寅(yín)、卯(mǎo)、辰(chén)、巳(sì)、午(wǔ)、

C++ 洛谷 哈希表(对应题库:哈希,hash)习题集及代码

马上就开学了,又一个卷季,不写点东西怎么行呢?辣么,我不准备写那些dalao们都懂得,熟练的,想来想去,最终还是写哈希表吧!提供讲解&题目&代码解析哦! 奉上题目链接: 洛谷题目 - 哈希,hash 1、哈希、哈希表(hash)简介 哈希(Hash)是一种将任意长度的输入映射为固定长度输出的算法。哈希函数的输出值称为哈希值或散列值。哈希函数具有以下特性: 确定性:对于相同的输入

1hdu022数据结构堆栈-火车进站

/*判断一串序列能否按照堆栈的方式,进出栈之后得到另外一组序列*/ /*要把题目当做已知进出序列进行对比*/ #include<iostream>#include<cstdio>#include<cstring>using namespace std;struct node{char st[4];}str[10000];int main(){int n,i,j,t,k,ok