社区讨论
样例没换行!!!
P1967[NOIP 2013 提高组] 货车运输参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @m5fbxfx0
- 此快照首次捕获于
- 2025/01/02 20:55 去年
- 此快照最后确认于
- 2025/11/04 12:03 4 个月前
服了TAT
CPP#include<bits/stdc++.h>
using namespace std;
const int N=10000+10;
const int M=50000+10;
int n,m,k,tot,cnt,qq;
int fa[N];
int f[N][20],dep[N];
int sum[N][20]/*n向上走最短距离*/,elast[N];
bool vis[N];
struct node{
int x,y,z;
}a[M];
struct mode{
int y,next,z;
}e[N*2];//存图的数组
void add(int x,int y,int z){
e[++cnt].y=y;
e[cnt].z=z;
e[cnt].next=elast[x];
elast[x]=cnt;
}//建图的
void dfs(int u,int faa){
f[u][0]=faa;
dep[u]=dep[faa]+1;
vis[u]=true;//防止根节点错了
for(int j=1;j<=k;j++){
f[u][j]=f[f[u][j-1]][j-1];
sum[u][j]=min(sum[u][j-1],sum[f[u][j-1]][j-1]);
}
for(int i=elast[u];i;i=e[i].next){
int v=e[i].y,z=e[i].z;
if(v!=faa){
sum[v][0]=z;
dfs(v,u);
}
}
}
int lca(int x,int y){
if(dep[x]<dep[y]) swap(x,y);
int ans=1e9;
for(int i=k;i>=0;i--){
if(dep[f[x][i]]>=dep[y]){
ans=min(ans,sum[x][i]);
x=f[x][i];
}
}
if(x==y) return ans;
for(int i=k;i>=0;i--){
if(f[x][i]!=f[y][i]){
ans=min(ans,min(sum[x][i],sum[y][i]));
x=f[x][i];
y=f[y][i];
}
}
ans=min(ans,min(sum[x][0],sum[y][0]));
return ans;
}
int getfa(int v){
if(fa[v]==v) return v;
else {
int j=getfa(fa[v]);
fa[v]=j;
return fa[v];
}
}//找爸爸
bool cmp(node a,node b){
return a.z>b.z;
}
int main(){
scanf("%d%d",&n,&m);
k=log2(n);
for(int i=1;i<=n;i++) fa[i]=i;
for(int i=1;i<=m;i++){
scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z);
}
sort(a+1,a+1+m,cmp);
for(int i=1;i<=m && tot<n-1;i++){
int fx=getfa(a[i].x);
int fy=getfa(a[i].y);
if(fx!=fy){
fa[fx]=fy;
tot++;
add(a[i].x,a[i].y,a[i].z);
add(a[i].y,a[i].x,a[i].z);
}
}
for(int i=1;i<=n;i++) {
if(!vis[i]){
dfs(i,0);
}
}
scanf("%d",&qq);
for(int i=1;i<=qq;i++){
int x,y;
scanf("%d%d",&x,&y);
if(getfa(x)!=getfa(y)) printf("-1\n");
else{
printf("%d\n",lca(x,y));
}
}
return 0;
}
做出来没有问题,用次数换,样例他没有换行!!!全WA,求大佬告诉,怎么搞,找管理员?
回复
共 2 条回复,欢迎继续交流。
正在加载回复...