题目描述

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. cpp(第十一章)

    1. std::istream & operator>>(std::istream &is,complex_c &t) { std::cout<<&qu ...

  2. Python函数之简单总结

    函数的定义 Python的函数定义使用关键字def,如定义一个返回绝对值的函数my_abs def my_abs(x): if x>=0: return x else: return -x 函数 ...

  3. MySQL优化之表结构优化的5大建议(数据类型选择讲的很好)

    殊不知,在N年前被奉为"圣经"的数据库设计3范式早就已经不完全适用了.这里我整理了一些比较常见的数据库表结构设计方面的优化技巧,希望对大家有用. 由于MySQL数据库是基于行(Ro ...

  4. discuz用户登录不响应,提示nginx gateway timeout解决方法

    在使用nginx+php-cgi搭建discuz论坛过程中,出现论坛登录不响应,一直提示nginx gateway timeout504网关超时,单单采用php方式登录无问题.但因需要使用nginx把 ...

  5. springmvc 之 DispatcherServlet

    DispatcherServlet说明 使用Spring MVC,配置DispatcherServlet是第一步. DispatcherServlet是一个Servlet,所以可以配置多个Dispat ...

  6. 为Windows资源管理器右键菜单添加菜单项

    为Windows资源管理器右键菜单添加菜单项 在Windows下命令行用的比较多,经常在资源管理器里翻到某个目录,若想要在此目录下跑命令,只能是打开cmd.exe,然后一路cd才能到达此目录. 每次都 ...

  7. nginx常用配置系列-HTTPS配置

    接上篇,nginx配置系列 HTTPS现在已经很流行,特别是AppStore上线的应用要求使用HTTPS进行通信,出于安全考虑也应该使用HTTPS,HTTPS配置需要准备证书文件,现在也有很多免费证书 ...

  8. 解决jenkins下使用HTML Publisher插件后查看html报告显示不正常 以jmeter报告为例

    jenkins 配置使用html publisher查看jmeter html报告时,发现显示不全,很多东西显示不了.   项目配置:   查看html报告异常(很多资源无法加载):   控制台查看加 ...

  9. Selenium chrome配置不加载图片Python版

    环境: windows 7 + Python 3.5.2 + Selenium 3.4.2 + Chrome Driver 2.29 + Chrome 58.0.3029.110 (64-bit) f ...

  10. 如何在家自制LED灯?很简单,我来告诉你!

    首先LED分凸头.平头和凹头,当中的凹头是没无方向性. 做示宽灯这类晚间才运用的光源,用凹头就好,它没无方向性,可将整个反光碗照亮. 做转向灯等指示性的光源用,准绳上应该用凸头的,它是个聚光镜,投映的 ...