社区讨论

大神们,,实在看不出来哪错,,就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 条回复,欢迎继续交流。

正在加载回复...