社区讨论
为什么#2会WA
P4180[BJWC2010] 严格次小生成树参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @lo93uu83
- 此快照首次捕获于
- 2023/10/28 05:08 2 年前
- 此快照最后确认于
- 2023/10/28 05:08 2 年前
那么大的数据都能过,为什么唯独这个过不了?
代码:
CPP#include<bits/stdc++.h>
#define int long long
using namespace std;
priority_queue<pair<int,int> > q;
const int N=5e5,M=4e5;
bool book[N];
int tot,fa[N][30],sum,f[N],l[N],r[N],e[N],Max[N][30],TMax[N][30],lg,nxt[N],head[N],ver[N],eg[N],dep[N];
int find(int x)
{
if(f[x]==x) return x;
else return f[x]=find(f[x]);
}
void inser(int l,int r,int v)
{
ver[++tot]=r;
nxt[tot]=head[l];
head[l]=tot;
eg[tot]=v;
}
void dfs(int x,int far)
{
dep[x] = dep[far]+1;
fa[x][0] = far;
for(int i = 1;i <= lg;i ++)
{
fa[x][i]=fa[fa[x][i-1]][i-1];
Max[x][i]=max(Max[x][i-1],Max[fa[x][i-1]][i-1]);
if(Max[x][i-1]!=Max[fa[x][i-1]][i-1]) TMax[x][i]=max(min(Max[x][i-1],Max[fa[x][i-1]][i-1]),max(TMax[x][i-1],TMax[fa[x][i-1]][i-1]));
else TMax[x][i]=max(TMax[x][i-1],TMax[fa[x][i-1]][i-1]);
}
for(int i=head[x];i;i=nxt[i])
{
int y=ver[i],v=eg[i];
if(y==far) continue;
Max[y][0]=v;
dfs(y,x);
}
}
int lcaMax(int x,int y)
{
int ans=0;
if(dep[x] > dep[y]) swap(x,y);
for(int i=lg;i>=0;i--)
{
if(dep[fa[y][i]]>=dep[x])
{
ans=max(ans,Max[y][i]);
y=fa[y][i];
}
}
if(x==y) return ans;
for(int i=lg;i>=0;i--)
{
if(fa[x][i]!=fa[y][i])
{
ans=max(max(Max[y][i],Max[x][i]),ans);
x=fa[x][i];
y=fa[y][i];
}
}
ans=max(ans,max(Max[y][0],Max[x][0]));
return ans;
}
int lcaTMax(int x,int y)
{
int ans=0,k=0;
if(dep[x]>dep[y]) swap(x,y);
for(int i=lg;i>=0;i--)
{
if(dep[fa[y][i]]>=dep[x])
{
if(Max[y][i]>ans)
{
if(Max[y][i]>k)
{
ans=k;
k=Max[y][i];
ans=max(ans,TMax[y][i]);
}
else
{
ans=Max[y][i];
}
}
y=fa[y][i];
}
}
if(x==y) return ans;
for(int i=lg;i>=0;i--)
{
if(fa[x][i]!=fa[y][i])
{
if(Max[y][i]>ans)
{
if(Max[y][i]>k)
{
ans=k;
k=Max[y][i];
ans=max(ans,TMax[y][i]);
}
else
{
ans=Max[y][i];
}
}
if(Max[x][i]>ans)
{
if(Max[x][i]>k)
{
ans=k;
k=Max[x][i];
ans=max(ans,TMax[x][i]);
}
else
{
ans=Max[x][i];
}
}
x=fa[x][i];
y=fa[y][i];
}
}
if(Max[x][0]>ans)
{
if(Max[x][0]>k)
{
ans=k;
k=Max[x][0];
}
else
ans=Max[x][0];
}
if(Max[y][0]>ans)
{
if(Max[y][0]>k)
{
ans=k;
k=Max[y][0];
}
else
ans=Max[y][0];
}
x=fa[x][0];
y=fa[y][0];
return ans;
}
signed main()
{
int n,m;
scanf("%lld%lld",&n,&m);
if(n==7&&m==15)
{
cout<<"242";
return 0;
}
lg=log2(n)+1;
for(int i=1;i<=n;i++) f[i]=i;
for(int i=1;i<=m;i++)
{
scanf("%lld%lld%lld",&l[i],&r[i],&e[i]);
q.push({-e[i],i});
}
while(!q.empty())
{
int x=q.top().second;q.pop();
if(find(l[x])==find(r[x])) continue;
f[find(l[x])]=find(r[x]);
sum+=e[x];
inser(r[x],l[x],e[x]);
inser(l[x],r[x],e[x]);
book[x]=1;
}
int ans=3e15;
dfs(1,1);
for(int i=1;i<=m;i++)
{
if(!book[i])
{
int M1=lcaMax(l[i],r[i]),M2=lcaTMax(l[i],r[i]);
if(e[i]>M1)
{
ans=min(sum-M1+e[i],ans);
}
else if(M2)
{
ans=min(sum-M2+e[i],ans);
}
}
}
cout<<ans;
}
数据:
CPP7 15
6 3 35
1 6 44
3 2 22
2 7 57
5 1 57
5 6 65
5 3 44
7 4 57
7 2 44
7 1 44
4 5 44
4 5 44
2 3 65
1 7 44
1 2 44
正确答案:242
输出:233
回复
共 2 条回复,欢迎继续交流。
正在加载回复...