#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 ;
}

最新文章

  1. 软件工程(FZU2015)赛季得分榜,第10回合(alpha冲刺)
  2. python基础篇
  3. 构建winform控件数据缓存器
  4. BZOJ solve 100 纪念
  5. 每日学习心得:SQL查询表的行列转换/小计/统计(with rollup,with cube,pivot解析)
  6. poj 1986 Distance Queries
  7. 单机版搭建Hadoop环境图文教程详解
  8. jQuery中Ajax的应用
  9. 关于AngularJS学习整理---浅谈$scope(作用域) 新手必备!
  10. php中读取中文文件夹及文件报错
  11. 配置ssh无密码登陆Linux
  12. TP5新增模块
  13. dubbo请求报文实例
  14. centos7 清除系统日志、历史记录(包括history)、登录信息
  15. The type java.lang.Object cannot be resolved
  16. Suricata在ubuntu14.04环境下安装
  17. Archlinux 遇到的坑
  18. Android网络编程系列之Volley总结
  19. es match、match_phrase、query_string和term的区别
  20. Jquery each&amp;forEach

热门文章

  1. java.lang.ClassNotFoundException: org.springframework.boot.context.embedded.FilterRegistrationBean
  2. MAC Safari上网弹窗弹广告的最新有效解决方法
  3. cassandra在服务端像leveldb一样进行插入初试成功
  4. 棋盘问题(dp)
  5. ul下的li浮动,如何是ul有li的高度
  6. ASP.NET Core:WebAppCoreAngular
  7. windows8如何显示开始菜单
  8. 041--Jquery
  9. 015--python集合和字符串
  10. 任务17:从UML角度来理解依赖