传送药水
(喝了这一壶传送药水,保你看了什么题都觉得神清气爽)
这题不算水。
首先想到,肯定需要跑一遍最大生成树,因为我们需要尽可能大的限制。
那么,接下来就是求两点之间最小限制。
那么就是我们就可以用求LCA(最近公共祖先)来解决这个问题。
所以就倍增好了。
我们这里倍增的有两个数组,一个是祖先,另一个是当前点到祖先的路上的最小限制。
最后理一遍思路:
先kruskal建立一个最大树(图)。
然后bfs建立一个树,处理一些基本数据。
然后就用倍增求LCA来解决就好了。
代码如下:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
struct edge{int u,v,w;
};
int n,m;
int p[10005];
edge e[50005];
int f[10005][21],deep[10005];
int g[10005][21];
int vis[10005];
vector<int> G[10005],H[10005];
//int fa[10005];
int ques;
int find(int xx){return xx==p[xx]?xx:p[xx]=find(p[xx]);
}
int cmp(edge a,edge b){return a.w>b.w;
}
void kruscal(){sort(e,e+m,cmp);for(int i=1;i<=n;i++){p[i]=i;}for(int i=0;i<m;i++){int xx=find(e[i].u),yy=find(e[i].v);if(xx!=yy){p[xx]=yy;G[e[i].u].push_back(e[i].v);G[e[i].v].push_back(e[i].u);H[e[i].u].push_back(e[i].w);H[e[i].v].push_back(e[i].w);}}
}
void bfs(){memset(g,0x3f,sizeof(g));memset(vis,0,sizeof(vis));memset(f,-1,sizeof(f));queue<int> q;int cur=3;deep[cur]=1;q.push(cur);vis[cur]=1;
//  f[cur][0]=-1;
//  fa[cur]=-1;while(!q.empty()){cur=q.front();q.pop(); int len=G[cur].size();for(int i=0;i<len;i++){if(vis[G[cur][i]]==0){q.push(G[cur][i]);vis[G[cur][i]]=1;deep[G[cur][i]]=deep[cur]+1;f[G[cur][i]][0]=cur;
//              fa[G[cur][i]]=cur;//待定 g[G[cur][i]][0]=H[cur][i];}}}
}
void init(){for(int k=0;k<20;k++){for(int j=1;j<=n;j++){if(f[j][k]!=-1){f[j][k+1]=f[f[j][k]][k];g[j][k+1]=min(g[j][k],g[f[j][k]][k]);}}}
}
int ans;
int jump(int u,int step){for(int k=0;k<21;k++){if(step&(1<<k)){ans=min(ans,g[u][k]);u=f[u][k];}}return u;
}
void lca(int u,int v){ans=0x3f3f3f3f;if(deep[u]<deep[v]){swap(u,v);}u=jump(u,deep[u]-deep[v]);for(int k=20;k>=0;k--){if(f[u][k]!=f[v][k]){ans=min(min(ans,g[u][k]),g[v][k]);u=f[u][k];v=f[v][k];}}ans=u==v?ans:min(min(ans,g[u][0]),g[v][0]);
}
int main(){scanf("%d%d",&n,&m);for(int i=0;i<m;i++){e[i].w=0;}for(int i=0;i<m;i++){int ww;scanf("%d%d%d",&e[i].u,&e[i].v,&ww);e[i].w=max(e[i].w,ww);}kruscal();bfs();init();scanf("%d",&ques);while(ques--){int u,v;scanf("%d%d",&u,&v);if(u>n||v>n){printf("-1\n");continue;}if(find(u)!=find(v)){printf("-1\n");continue;}else{lca(u,v);if(ans<0x3f3f3f3f){printf("%d\n",ans);}else{printf("-1\n");}}}return 0;
} 

火车运输(NOIP2013)相关推荐

  1. 贪心--2016cqround4火车运输

    P3827火车运输 时间限制 : - MS   空间限制 : 265536 KB   评测说明 : 1000ms 问题描述 ByteLand火车站(编号0)每天都要发往全国各地N列客运火车,编号1 N ...

  2. 【题】【贪心】NKOJ3827 火车运输

    NKOJ3827 火车运输 时间限制 : - MS 空间限制 : 265536 KB 评测说明 : 1000ms 问题描述 ByteLand火车站(编号0)每天都要发往全国各地N列客运火车,编号1 N ...

  3. 【CODEVS 3287】【NOIP2013】火车运输

    http://codevs.cn/problem/3287/ 题目描述 国有 座城市,编号从 到 ,城市之间有 条双向道路.每一条道路对车辆都有重 量限制,简称限重.现在有 辆货车在运输货物, 司机们 ...

  4. [NOIP2013提高组] CODEVS 3287 火车运输(MST+LCA)

    一开始觉得是网络流..仔细一看应该是最短路,再看数据范围..呵呵不会写...这道题是最大生成树+最近公共祖先.第一次写..表示各种乱.. 因为要求运输货物质量最大,所以路径一定是在最大生成树上的.然后 ...

  5. 【noip】【lca】火车运输 倍增

    这几天把13年的提高做了,最后两道题参考了网上许多代码,最后终于改出来了,这里是day1最后一题. 描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量 ...

  6. 洛谷1967 火车运输 kruskal求最大生成树 倍增LCA维护最小值

    传送门 其实NOIP某些年的第三题也并不是很难嘛... 题目分析: 题目中要求求出某两点之间可以运输的最大重量,也就是这两个点的某条路径上边权最小的边的权值的最大值 很显然,题目中的运输最大重量与选择 ...

  7. NKOI 2495 火车运输

    [NOIP2013-D1T3]货车运输 Time Limit:10000MS  Memory Limit:128000K Total Submit:95 Accepted:57 Case Time L ...

  8. 洛谷1967 火车运输

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

  9. [最大生成树Kruskal/倍增LCA] 火车运输 洛谷P1967

    题目描述 AA 国有 nn 座城市,编号从 11 到 nn ,城市之间有 mm 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 qq 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重 ...

最新文章

  1. 柱坐标系下的ns方程_笛卡尔坐标系到底是什么?
  2. AppSettings和ConnectionStrings的使用。
  3. 纯CSS3实现轮播图
  4. 《价值50亿的10句话》读后感(学生作业分享)
  5. python质数列_现代化程序开发笔记(3)——多文件与模块
  6. 一定质量的封闭气体被压缩后_多晶硅氯氢化装置补充氢隔膜压缩机十字头铜套磨损原因分析与改善探讨...
  7. node本地连接服务器的数据库_Linux本地连接阿里云服务器,以及下载node.js配置环境...
  8. 模型算法_生产建模型 算法控效率
  9. 《HTML CSS JavaScript 网页制作从入门到精通 第3版》—— 2.8 其他标记
  10. UML快速指南(摘要)转载
  11. NumpyML : Linear Regression
  12. 毕业设计之---基于java web的停车管理系统
  13. .net core快速开发平台,learun自主工作流引擎设计规范
  14. 服务器 cpu型号怎么看,服务器cpu参数肿么看
  15. SpringBoot31 整合SpringJDBC、整合MyBatis、利用AOP实现多数据源
  16. 今天学习腌菜,啦啦啦啦啦
  17. python函数的四种参数传递方式
  18. 80c51汇编语言程序案例指导,新第4章80C51的汇编语言程序设计
  19. CS 188 (4) Uniform Cost Search( 统一代价搜索算法)
  20. Java面试题目,CAS都不了解,你还怎么看J-U-C不可思议!

热门文章

  1. 《程序员的数学思维修炼》 读书笔记
  2. 珍惜那些在背后默默为你付出的人
  3. matlab用diag直接使用错误_matlab中的diag(diag(a))是什么意思?
  4. 微积分基础知识note
  5. Page Rank查询工具 | Page Rank Checker
  6. 史上最全的Android面试题集锦,大厂内部资料
  7. cadence的parametric analysis设置
  8. 2021全球与中国波长选择开关(WSS)市场现状及未来发展趋势
  9. (附源码)app电影选座订票 毕业设计 011439
  10. Hello!我的大学生活学习指南