#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. 用secureCRT ssh登陆不显示用户名和路径解决方案 分类: 软件工具学习 2015-03-18 16:52 36人阅读 评论(0) 收藏

    方法1         每次开始的时候输入 bash 虽然只能保存一次,但是简便. 方法2 用       vi ~/.bash_profile   编辑这个文件,  有时会提示这个文件不存在,直 ...

  2. Caused by: java.lang.IllegalArgumentException: Malformed \uxxxx encoding.

    application.properties中不能含有\符号.  只要遇到就会报这个错误. 解决方式:将application.properties中的 \ 改为 \\ 或者 /  

  3. 「LuoguP2014」 选课

    Description 在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之前学习.现在有N门功课,每门课有个学 ...

  4. RobotFramework:App滑动屏幕

    转自:http://blog.csdn.net/jgw2008/article/details/77993399 在使用Robot Framework测试Android机器过程中, 经常要用到滚屏操作 ...

  5. JS按字节截取字符长度实例2

    /* * param str 要截取的字符串 * param L 要截取的字节长度,注意是字节不是字符,一个汉字两个字节 * return 截取后的字符串 */ function cutStr(str ...

  6. django上课笔记1-目录介绍-路由系统-ORM操作

    一.Django目录介绍 django-admin startproject mysite # 创建名为mysite的项目 cd mysite # 切换到该目录下 python manage.py s ...

  7. Spring boot 启动报错:com.mongodb.MongoSocketOpenException: Exception opening socket

    详细错误信息: com.mongodb.MongoSocketOpenException: Exception opening socket at com.mongodb.connection.Soc ...

  8. CodeForces 712A Memory and Crow (水题)

    题意:有一个序列,然后对每一个进行ai = bi - bi + 1 + bi + 2 - bi + 3.... 的操作,最后得到了a 序列,给定 a 序列,求原序列. 析:很容易看出来,bi = ai ...

  9. ORACLE知识点整理之一

    1. 安装客户端 去官方网站下载 此处略 2. 客户端登陆身份 Oracle有三种身份登录方式:Normal.sysdba.sysoper. normal身份:普通用户身份,默认选项(默认可以不写), ...

  10. python 基本类型的创建方法

    1.int class int(object) | int(x=0) -> integer | int(x, base=10) -> integer | | Convert a numbe ...