题目描述

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。

输入输出样例

输入样例#1:

4 3
1 2 4
2 3 3
3 1 1
3
1 3
1 4
1 3
输出样例#1:

3
-1
3

说明

对于 30%的数据,0 < n < 1,000,0 < m < 10,000,0 < q< 1,000;

对于 60%的数据,0 < n < 1,000,0 < m < 50,000,0 < q< 1,000;

对于 100%的数据,0 < n < 10,000,0 < m < 50,000,0 < q< 30,000,0 ≤ z ≤ 100,000。


因为这题在bzoj里又是那啥啥,所以就又交luogu了

代码这么长又比别人慢真是太尴尬了

这么慢思路肯定很easy对吧

->先求用kruskal最大生成树,可忽略重边问题

->以重心为根造树

->对于每一组询问(ss,tt),求其lca

->我这边模拟了它从ss和tt走到lca,程序秒速变慢  QwQ(懒癌晚期)

 #include<cstdio>
#include<cstring>
#include<iostream>
#include<vector>
#include<algorithm>
#define inf 0x3f3f3f3f
using namespace std;
#define ss first
#define tt second inline int read(){
char ch;
int re=;
bool flag=;
while((ch=getchar())!='-'&&(ch<''||ch>''));
ch=='-'?flag=:re=ch-'';
while((ch=getchar())>=''&&ch<='') re=re*+ch-'';
return flag?-re:re;
} struct odge{
int from,to,w;
odge(int from=,int to=,int w=):
from(from),to(to),w(w){}
bool operator < (const odge &n1) const {
return w>n1.w;
}
};
struct edge{
int to,w,next;
edge(int to=,int w=,int next=):
to(to),w(w),next(next){}
};
const int maxn=,maxm=;
const int maxlogn=;
int n,m;
vector<odge> odges;
vector<edge> edges;
int head[maxn];
int par[maxn];
int cnt=;
int F[maxn],son[maxn];
bool vis[maxn];
int sum,root;
int depth[maxn],parent[maxlogn][maxn];
int q;
typedef pair<int,int> PII;
vector<PII> ques;
int length[maxn]; inline void add_edge(odge e){
edges.push_back(edge(e.to,e.w,head[e.from]));
head[e.from]=++cnt;
edges.push_back(edge(e.from,e.w,head[e.to]));
head[e.to]=++cnt;
} int find(int x){
return par[x]==x?x:par[x]=find(par[x]);
} void kruskal(){
memset(head,,sizeof head);
edges.push_back(edge(,,));
int cnt1=,cnt2=;
while(cnt2<m){
odge e=odges[cnt2++];
int dx=find(e.from),dy=find(e.to);
if(dx==dy) continue;
add_edge(e);
par[dy]=dx;
if(++cnt1==n) break;
}
} void getroot(int x,int fa){
son[x]=; F[x]=;
for(int ee=head[x];ee;ee=edges[ee].next)
if(edges[ee].to!=fa){
getroot(edges[ee].to,x);
son[x]+=son[edges[ee].to];
F[x]=max(F[x],son[edges[ee].to]);
}
F[x]=max(F[x],sum-son[x]);
if(F[x]<F[root]) root=x;
} void dfs(int x,int fa,int deep){
parent[][x]=fa;
depth[x]=deep;
for(int ee=head[x];ee;ee=edges[ee].next)
if(edges[ee].to!=fa){
length[edges[ee].to]=edges[ee].w;
dfs(edges[ee].to,x,deep+);
}
} void init(){
n=read(); m=read();
for(int i=;i<m;i++){
int from=read(),to=read(),w=read();
odges.push_back(odge(from,to,w));
}
for(int i=;i<=n;i++)
par[i]=i;
sort(odges.begin(),odges.end());
kruskal();
sum=F[root=]=n;
getroot(,);
dfs(root,-,);
for(int k=;k+<maxlogn;k++)
for(int v=;v<=n;v++)
if(parent[k][v]<) parent[k+][v]=-;
else parent[k+][v]=parent[k][parent[k][v]];
q=read();
for(int i=;i<q;i++){
int from=read(),to=read();
ques.push_back(make_pair(from,to));
}
} int getlca(int u,int v){
if(depth[u]>depth[v]) swap(u,v);
for(int k=;k<maxlogn;k++)
if(depth[v]-depth[u]>>k&) v=parent[k][v];
if(u==v) return u;
for(int k=maxlogn-;k>=;k--)
if(parent[k][u]!=parent[k][v]){
u=parent[k][u];
v=parent[k][v];
}
return parent[][u];
} void solve(){
for(int i=;i<q;i++){
int u=ques[i].ss,v=ques[i].tt;
if(find(u)!=find(v)){
puts("-1");
continue;
}
int ans=inf;
int lca=getlca(ques[i].ss,ques[i].tt); while(u!=lca){
ans=min(ans,length[u]);
u=parent[][u];
}
while(v!=lca){
ans=min(ans,length[v]);
v=parent[][v];
} printf("%d\n",ans);
}
} int main(){
//freopen("temp.in","r",stdin);
init();
solve();
return ;
}

天亮的时候 你还没回来

亲爱的 我们的孩子醒来了

[luogu P1967][NOIp2013] 货车运输的更多相关文章

  1. [Luogu 1967] NOIP2013 货车运输

    [Luogu 1967] NOIP2013 货车运输 一年多前令我十分头大的老题终于可以随手切掉了- 然而我这码风又变毒瘤了,我也很绝望. 看着一年前不带类不加空格不空行的清纯码风啊,时光也好像回去了 ...

  2. 【Luogu P1967】货车运输

    Luogu P1967 题目大意:给定一张图和q个询问,询问x节点和y节点的路径之间最小边权最大可以是多少. 可以发现对于一条边\(E(x,y)\),如果x到y有另一条路径且最小边权大于\(E(x,y ...

  3. NOIP2013 货车运输(最大生成树,倍增)

    NOIP2013 货车运输(最大生成树,倍增) A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物,司机们想知道 ...

  4. 【洛谷P1967】[NOIP2013]货车运输

    货车运输 题目链接 显然,从一点走到另一点的路径中,最小值最大的路径一定在它的最大生成树上 所以要先求出最大生成树,再在生成树上找最近公共祖先,同时求出最小值. #include<iostrea ...

  5. noip2013货车运输

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

  6. 【题解】【洛谷 P1967】 货车运输

    目录 洛谷 P1967 货车运输 原题 题解 思路 代码 洛谷 P1967 货车运输 原题 题面请查看洛谷 P1967 货车运输. 题解 思路 根据题面,假设我们有一个普通的图: 作图工具:Graph ...

  7. NOIP2013 货车运输 (最大生成树+树上倍增LCA)

    死磕一道题,中间发现倍增还是掌握的不熟 ,而且深刻理解:SB错误毁一生,憋了近2个小时才调对,不过还好一遍AC省了更多的事,不然我一定会疯掉的... 3287 货车运输 2013年NOIP全国联赛提高 ...

  8. NOIP2013 货车运输

    3.货车运输 (truck.cpp/c/pas) [问题描述] A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货 ...

  9. Codevs3278[NOIP2013]货车运输

    3287 货车运输 2013年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond      题目描述 Description A 国有 ...

随机推荐

  1. Qt自定义标签按钮

    当你接触到Qt时,你会为它极为方便的跨平台方面感到吃惊,从而想尝试着使用Qt.渐渐地你会发现Qt自带的一些控件不能满足自己的需要,此时就需要我们自己定义一个属于自己的控件.总所周知,标签的风格设置类比 ...

  2. 用户权限模块之spring security

    准备工作:数据库采用mysql(5.6及以上) CREATE TABLE `auth_system` ( `ID` int(11) NOT NULL AUTO_INCREMENT COMMENT 'I ...

  3. JS语句

    JS语句包括: 1.顺序语句 2.分支语句:  if...else                   switch...case 3.循环语句 一.先看顺序语句: </body> < ...

  4. javascript中event.clientX和event.clientY用法的注意事项

    今天做项目用到了event.clientX和event.clientY,给元素定位,用定位的时候,让top和left等于事件元素的的坐标 <!DOCTYPE html> <html& ...

  5. Deep Q-Network 学习笔记(一)—— Q-Learning 学习与实现过程中碰到的一些坑

    这方面的资料比较零散,学起来各种碰壁,碰到各种问题,这里就做下学习记录. 参考资料: https://morvanzhou.github.io/ 非常感谢莫烦老师的教程 http://mnemstud ...

  6. java 实例变量的初始化

    1.对于实例变量,该类没创建一次实例,就需要为实例变量分配一块内存空间:2.程序通过Person对象来访问eyeNum类变量时,底层依然会转换为通过Person访问eyeNum类变量:3.当Perso ...

  7. java源码学习(四)ArrayList

    ArrayList ​ ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长,类似于C语言中的动态申请内存,动态增长内存. ​ ArrayList不是线程安全的,只能用在单线程环境下, ...

  8. 关于Iscroll.js 的滑动和Angular.js路由冲突问题

    Iscroll主要应用于app移动端开发. 主要代码: window.onload=function(){ var myIscroll=new IScroll(".headerNav&quo ...

  9. 大话Python中*args和**kargs的使用

    对于初学者来说,看到*args和**kargs就头大,到底它们有何用处,怎么使用?这篇文章将为你揭开可变参数的神秘面纱 1.*args 实质就是将函数传入的参数,存储在元组类型的变量args当中 de ...

  10. .NET C#到Java没那么难,Servlet篇

    前言 .NET C#到Java没那么难,都是面向对向的语言,而且语法还是相似的,先对比一下开发环境,再到Servlet,再到MVC,都是一样一样的,只是JAVA的配制项比较多而已,只要配好一个,后面都 ...