社区讨论
只WA了第一个点,求大佬调
P2245星际导航参与者 2已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @mi5rvecw
- 此快照首次捕获于
- 2025/11/19 17:00 4 个月前
- 此快照最后确认于
- 2025/11/21 00:01 4 个月前
只WA了第一个点,求大佬调
CPP#include<bits/stdc++.h>
using namespace std;
int pro[600006],head[600006],nex[600006],cnt=0;
void ll(int x,int y){
pro[++cnt]=y;
nex[cnt]=head[x];
head[x]=cnt;
}
int lg[600006];
int f[600006];
int cha[600006][30];
struct node{
int x,y,z;
}a[600006];
int dianquan[600006];
int deep[600005];
bool cmp(node x,node y){
return x.z<y.z;
}
int find(int x){
return f[x]==x?x:f[x]=find(f[x]);
}
void merge(int x,int y){
f[x]=y;
}
void dfs(int x,int fa){
deep[x]=deep[fa]+1;
cha[x][0]=fa;
for(int i=head[x];i!=-1;i=nex[i]){
if(pro[i]==fa){
continue;
}
dfs(pro[i],x);
}
}
int lca(int x,int y){
if(deep[x]<deep[y]){
swap(x,y);
}
while(deep[x]>deep[y]){
x=cha[x][lg[deep[x]-deep[y]]];
}
if(x==y){
return x;
}
for(int i=20;i>=0;i--){
if(cha[x][i]!=cha[y][i]){
x=cha[x][i];
y=cha[y][i];
}
}
return cha[x][0];
}
int main(){
memset(head,-1,sizeof(head));
int n,m;
scanf("%d %d",&n,&m);
for(int i=1;i<=m;i++){
int x,y,z;
scanf("%d %d %d",&x,&y,&z);
a[i].x=x;
a[i].y=y;
a[i].z=z;
}
for(int i=1;i<=n+m;i++){
f[i]=i;
}
sort(a+1,a+1+m,cmp);
int now=n;
for(int i=1;i<=m;i++){
int x=a[i].x;
int y=a[i].y;
int z=a[i].z;
int fx=find(x);
int fy=find(y);
if(fx==fy){
continue;
}
now++;
merge(fx,now);
merge(fy,now);
dianquan[now-n]=z;
ll(now,fx);
ll(now,fy);
}
for(int i=2;i<=now;i++){
lg[i]=lg[i/2]+1;
}
dfs(now,0);
for(int j=1;j<=20;j++){
for(int i=1;i<=now;i++){
cha[i][j]=cha[cha[i][j-1]][j-1];
}
}
int q;
scanf("%d",&q);
while(q--){
int x,y;
scanf("%d %d",&x,&y);
int fx=find(x);
int fy=find(y);
if(fx!=fy){
printf("impossible\n");
continue;
}
int z=lca(x,y);
printf("%d\n",dianquan[z-n]);
}
return 0;
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...