比赛 |
中秋节快乐! |
评测结果 |
WWWWWWWWWWWWWWWWWWWW |
题目名称 |
货车运输 |
最终得分 |
0 |
用户昵称 |
dream |
运行时间 |
1.546 s |
代码语言 |
C++ |
内存使用 |
3.75 MiB |
提交时间 |
2024-09-17 11:34:39 |
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
const int N=10005,M=50005;
int n,m,q;
int f[N],ff[N][25],mn[N][25];
int hd[N],to[M],nxt[M],val[M],dep[N],tot;
struct node{
int x,y,v;
bool operator <(const node &t) const{
return v>t.v;
}
}edge[M];
void add(int x,int y,int v){
tot++;
to[tot]=y;
val[tot]=v;
nxt[tot]=hd[x];
hd[x]=tot;
}
void init(){
for(int i=1;i<=n;i++){
f[i]=i;
}
}
int find(int x){
if(x==f[x]){
return x;
}
return f[x]=find(f[x]);
}
int vis[N];
void kruskal(){
int sum=0;
for(int i=1;i<=m;i++){
node t=edge[i];
int fx=find(t.x),fy=find(t.y);
if(f[fx]==f[fy]){
continue;
}
sum++;
f[fy]=fx;
add(t.x,t.y,t.v);
add(t.y,t.x,t.v);
if(sum==n-1){
return;
}
}
}
void dfs(int x,int fa){
dep[x]=dep[fa]+1;
ff[x][0]=fa;
for(int i=1;i<=20;i++){
ff[x][i]=ff[ff[x][i-1]][i-1];
mn[x][i]=min(mn[x][i-1],mn[ff[x][i-1]][i-1]);
}
for(int i=hd[x];i;i=nxt[i]){
int y=to[i];
if(y==fa){
continue;
}
if(vis[y]){
continue;
}
mn[y][0]=val[i];
dfs(y,x);
}
}
int lca(int x,int y){
int ans=2147483647;
int fx=find(x);
int fy=find(y);
if(fx!=fy){
return -1;
}
if(dep[x]<dep[y]){
swap(x,y);
}
for(int i=20;i>=0;i--){
if(dep[x]-(1<<i)){
x=ff[x][i];
ans=min(ans,mn[x][i]);
}
}
if(x==y){
return ans;
}
for(int i=20;i>=0;i--){
if(ff[x][i]!=ff[y][i]){
ans=min(ans,mn[x][i]);
ans=min(ans,mn[y][i]);
x=ff[x][i];
y=ff[y][i];
}
}
return min(ans,mn[ff[x][0]][0]);
}
int main(){
freopen("truck.in","r",stdin);
freopen("truck.out","w",stdout);
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>edge[i].x>>edge[i].y>>edge[i].v;
}
sort(edge+1,edge+m+1);
kruskal();
cin>>q;
for(int i=1;i<=q;i++){
int x,y;
cin>>x>>y;
cout<<lca(x,y)<<"\n";
}
return 0;
}