#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int MAXN=;
int n,m;
int x,y,z;
struct node
{
int u,v,w,next;
}edge[MAXN],a[MAXN];
int num=;
int head[MAXN];
int f[MAXN];
int anum=;
int ahead[MAXN];
int deep[MAXN];
int s[MAXN][];
int take[MAXN][];
void edge_add(int x,int y,int z)
{
edge[num].u=x;
edge[num].v=y;
edge[num].w=z;
edge[num].next=head[x];
head[x]=num++;
}
void a_add(int i)
{
a[anum].u=edge[i].u;
a[anum].v=edge[i].v;
a[anum].w=edge[i].w;
a[anum].next=ahead[a[anum].u];
ahead[a[anum].u]=anum++;
}
int comp(const node & a ,const node & b)
{return a.w>b.w;} int find(int x)
{
if(f[x]!=x)
f[x]=find(f[x]);
return f[x];
}
void unionn(int x,int y)
{
int fx=find(x);
int fy=find(y);
f[fx]=fy;
}
void Biggest_Kruskal()
{
sort(edge+,edge+num,comp);
int k=;
for(int i=;i<num;i++)
{
int uu=edge[i].u;
int vv=edge[i].v;
if(find(uu)!=find(vv))
{
unionn(uu,vv);
a_add(i);
k++;
}
if(k==n-)break;
}
for(int i=;i<=anum;i++)
cout<<a[i].u<<" "<<a[i].v<<" "<<a[i].w<<" "<<a[i].next<<endl;
}
void Build_Tree(int p)
{
for(int i=ahead[p];i!=-;i=a[i].next)
{
int will=a[i].v;
if(deep[will]==)
{
deep[will]=deep[p]+;
s[will][]=p;
take[will][]=a[i].w;
Build_Tree(will);
}
}
}
void Initialize_Step()
{
for(int i=;i<=;i++)
{
for(int j=;j<=n;j++)
{
s[j][i]=s[s[j][i-]][i-];
take[j][i]=min(take[j][i-],take[s[j][i-]][i-]);
}
}
}
int LCA(int x,int y)
{
int ans=0x7ff;
if(deep[x]<deep[y])
swap(x,y);
for(int i=;i>=;i--)
{
if(deep[s[x][i]]>=deep[y])
x=s[x][i];
}
if(x==y)
return x;
for(int i=;i>=;i--)
{
if(s[x][i]!=s[y][i])
{
x=s[x][i];
y=s[y][i];
ans=min(ans,take[x][i]);
ans=min(ans,take[y][i]);
}
}
ans=min(ans,take[x][]);
ans=min(ans,take[y][]);
return ans;
}
int main()
{
scanf("%d%d",&n,&m); for(int i=;i<=n;i++)
{head[i]=-;f[i]=i;ahead[i]=-;} for(int i=;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
edge_add(x,y,z);
//edge_add(y,x,z);
}
Biggest_Kruskal();
deep[]=;
for(int i=;i<=n;i++)
Build_Tree(i);
Initialize_Step();
int q;
scanf("%d",&q);
for(int i=;i<=q;i++)
{
int x,y;
scanf("%d%d",&x,&y);
if(find(x)!=find(y))
{
printf("-1\n");
continue;
}
printf("%d\n",LCA(x,y));
}
return ;
}

P1967 货车运输 未完成的更多相关文章

  1. 洛谷 P1967 货车运输

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

  2. P1967 货车运输

    P1967 货车运输最大生成树+lca+并查集 #include<iostream> #include<cstdio> #include<queue> #inclu ...

  3. 洛谷P3379lca,HDU2586,洛谷P1967货车运输,倍增lca,树上倍增

    倍增lca板子洛谷P3379 #include<cstdio> struct E { int to,next; }e[]; ],anc[][],log2n,deep[],n,m,s,ne; ...

  4. Luogu P1967 货车运输(Kruskal重构树)

    P1967 货车运输 题面 题目描述 \(A\) 国有 \(n\) 座城市,编号从 \(1\) 到 \(n\) ,城市之间有 \(m\) 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 \ ...

  5. 【杂题总汇】NOIP2013(洛谷P1967) 货车运输

    [洛谷P1967] 货车运输 重做NOIP提高组ing... +传送门-洛谷P1967+ ◇ 题目(copy from 洛谷) 题目描述 A国有n座城市,编号从1到n,城市之间有m条双向道路.每一条道 ...

  6. P1967 货车运输(倍增LCA,生成树)

    题目链接: https://www.luogu.org/problemnew/show/P1967 题目描述 A国有n座城市,编号从 1到n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制, ...

  7. 洛谷 P1967 货车运输 Label: 倍增LCA && 最小瓶颈路

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

  8. 洛谷 P1967 货车运输(克鲁斯卡尔重构树)

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

  9. P1967 货车运输 树链剖分

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

随机推荐

  1. SDUT 周赛 神奇的树(简单题 注意数据类型的溢出 )

    神奇的树 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 SDUT有一颗神奇的苹果树.假如某天早上这树上有x个苹果,那么这树这一天 ...

  2. iOS 观察者模式(KVO)的简单使用

    KVO的全称是Key-Value Observing,它实现了一种机制,对所关心的属性对象添加观察者,当属性值发生变化时会得到通知,我们可以对变化做相应的处理.看过设计模式的同学应该知道,这是一种典型 ...

  3. 【NOIP2014】 联合权值

    [题目链接] 点击打开链接 [算法] 如果(u,v)的距离为2,那么有两种可能 : 1.u和v为祖孙关系 2.u和v为兄弟关系 树形DP即可,详见代码 [代码] #include<bits/st ...

  4. MySQL数据库学习----理论基础

    一:数据存储发展过程 1. 人工管理阶段 主要存储在纸带.磁带等介质中,手工记录,效率低下. 2. 文件系统阶段 存储在计算机磁盘中,以文件形式出现,数据管理变得简单,但是数据没有结构化处理,不易于查 ...

  5. idea类名下有红色波浪线

    能编译通过说明SDK导入正确,但是为啥我们点击每一个Java文件会出现好多红色的下划线 ,并提示idea cant resolve symbol 原因就是可能没有清除原来的历史缓存,导致一些错误,解决 ...

  6. node --save可以省略掉手动修改package.json的步骤

    当你为你的模块安装一个依赖模块时,正常情况下你得先安装他们(在模块根目录下npm install module-name),然后连同版本号手动将他们添加到模块配置文件package.json中的依赖里 ...

  7. STS和Eclipse安装Lombok插件

    参考:https://www.cnblogs.com/caozx/p/9510354.html 参考:https://blog.csdn.net/wutian90/article/details/87 ...

  8. E20180404-ts

    aero  adj. 航空的,飞行的,飞机的; wheel   n. 轮子; 旋转; Wheels 汽车; 有…轮子的汽车(或自行车等); vi. 转动,旋转; 突然转变方向; foil n. 箔,金 ...

  9. (水题)洛谷 - P1036 - 选数

    https://www.luogu.org/problemnew/show/P1036 $n$ 才20的数据量,我当时居然还在想怎么分组组合,直接 $2^{20}$ 暴力搞就行了. $x_i $太大了 ...

  10. EOJ3247:铁路修复计划

    传送门 题意 分析 这题用二分做就好啦,有点卡常数,改了几下for的次数 套了个板子,连最小生成树都忘记了QAQ trick 代码 #include<cstdio> #include< ...