社区讨论
大神们,,实在看不出来哪错,,就WA最后两组T-T
P2245星际导航参与者 3已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @mi6oi3rz
- 此快照首次捕获于
- 2025/11/20 08:14 4 个月前
- 此快照最后确认于
- 2025/11/20 08:14 4 个月前
#include <bits/stdc++.h>
using namespace std;
#define M 200000
#define Max(a,b,c) max(max(a,b),c);
struct edge{int from,to,w;}a[M];
int small[M][50],fa[M],deep[M],anc[M][50];
int head[M],nxt[M],ver[M],val[M],cnt=0;
void add(int x,int y,int w){nxt[++cnt]=head[x],head[x]=cnt,ver[cnt]=y,val[cnt]=w;return ;}
queueq;
int n,m,k,x,y,w;
int find(int x){if(fa[x]!=x)fa[x]=find(fa[x]);return fa[x];}
void unionn(int x,int y){fa[y]=x;}
int cmp(edge x,edge y){return x.w<y.w;}
void BFS(){
memset(deep,0,sizeof(deep));
deep[1]=1;q.push(1);
while(q.size()){
int now=q.front();q.pop();
for(int i=head[now];i;i=nxt[i]){
if(!deep[ver[i]]){
q.push(ver[i]);
deep[ver[i]]=deep[now]+1;
anc[ver[i]][0]=now;small[ver[i]][0]=val[i];
for(int j=1;(1<<j)<=deep[ver[i]];j++){
anc[ver[i]][j]=anc[anc[ver[i]][j-1]][j-1];
small[ver[i]][j]=max(small[ver[i]][j-1],small[anc[ver[i]][j-1]][j-1]);
}
}}}return ;
}
int LCA(int x,int y){
int ans=0;
if(deep[x]<deep[y])swap(x,y);
int logmxn=(int)(log(n)/log(2));
for(int i=logmxn;i>=0;i--){
if(deep[x]-(1<<i)>=deep[y]){
ans=max(ans,small[x][i]);
x=anc[x][i];//notice! 这是卡住最大高度向下找的
}
}
if(x==y)return ans;
for(int i=logmxn;i>=0;i--){
if(anc[x][i]!=anc[y][i]){
//提升高度至下一个就是father
ans=Max(small[x][i],small[y][i],ans);
x=anc[x][i];y=anc[y][i];
}
}return Max(ans,small[x][0],small[y][0]);
}
void kruskal(){
sort(a+1,a+1+m,cmp);
for(int i=1;i<=m;i++){
int xx=find(a[i].from);int yy=find(a[i].to);
if(xx!=yy)unionn(xx,yy),add(a[i].from,a[i].to,a[i].w),add(a[i].to,a[i].from,a[i].w);
}return ;
}
void clean(){
for(int i=1;i<=n;i++)fa[i]=i;
memset(small,0,sizeof(small));
memset(deep,0,sizeof(deep));
memset(head,0,sizeof(head));cnt=0;
memset(anc,0,sizeof(anc));
}
int main(void){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
scanf("%d%d%d",&x,&y,&w);
a[i].from=x;a[i].to=y;a[i].w=w;
}
clean();
kruskal();
scanf("%d",&k);
BFS();
for(int i=1;i<=k;i++){
scanf("%d%d",&x,&y);
if(find(x)!=find(y))puts("impossible");
else printf("%d\n",LCA(x,y));
}
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...