社区讨论
solve 函数只会输出9223372036854775807求调
P4180[BJWC2010] 严格次小生成树参与者 2已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @mijqp6zk
- 此快照首次捕获于
- 2025/11/29 11:36 3 个月前
- 此快照最后确认于
- 2025/11/29 21:10 3 个月前
可能出问题的 solve 函数
CPPvoid solve(){
long long ess=LLONG_MAX;
for(long long i=1;i<=m;i++){
if(kt[i].fr==kt[i].to||vis[i]) continue;
if(mp[{kt[i].fr,{kt[i].to,kt[i].p}}]==1) continue;
long long lcaa=lca::getlca(kt[i].fr,kt[i].to);
long long mx=gtt(kt[i].fr,lcaa,kt[i].p);
long long my=gtt(kt[i].to,lcaa,kt[i].p);
ess=min(ess,ess-max(mx,my)+kt[i].p);
}
cout<<ess;
}
所有代码:
CPP#include <bits/stdc++.h>
using namespace std;
long long n,m;
const long long N=1e5+7;
const long long M=3e5+7;
struct Edge{
long long fr,to,p;
bool operator <(const Edge&ot)const{
return p<ot.p;
}
};
struct edge{
long long to,p;
};
long long fat[N];
Edge kt[M];
vector<edge> T[N];
map<pair<long long,pair<long long ,long long> >,bool> mp;
bool vis[M];
namespace bcj{
long long find(long long x){
if(fat[x]==x) return x;
return fat[x]=bcj::find(fat[x]);
}
void init(long long n){
for(long long i=1;i<=n;i++){
fat[i]=i;
}
}
void mg(long long x,long long y){
fat[bcj::find(x)]=bcj::find(y);
}
}
void ldd(long long x,long long y,long long p){//邻接表
T[x].push_back({y,p});
}
long long ans=0;
void ksk(){
//克鲁斯克
long long tot=0;
sort(kt+1,kt+1+m);
for(long long i=1;i<=m;i++){
long long fx=kt[i].fr,fy=kt[i].to;
if(bcj::find(fx)!=bcj::find(fy)){
bcj::mg(fx,fy);
ans+=kt[i].p;
ldd(fx,fy,kt[i].p);
ldd(fy,fx,kt[i].p);//无向建图
++tot;
}
mp[{kt[i].fr,{kt[i].to,kt[i].p}}]=1;
if(tot==n-1) break;//构成树后跑路
}
}
long long fa[N][25],wf[N][25],Ws[N][25];//倍增‘
long long ep[N];
namespace lca{
void dfs(long long now,long long lst){
ep[now]=ep[lst]+1;
fa[now][0]=lst;
//2^0个祖先是lst(last
for(long long i=1;i<=20;i++){
fa[now][i]=fa[fa[now][i-1]][i-1];
wf[now][i]=max(wf[now][i-1],wf[fa[now][i-1]][i-1]);
Ws[now][i]=max(Ws[now][i-1],Ws[fa[now][i-1]][i-1]);//Beizeng
if(wf[now][i-1]!=wf[fa[now][i-1]][i-1]){
Ws[now][i]=max(Ws[now][i],min(wf[now][i-1],wf[fa[now][i-1]][i-1]));
}
}
long long L=T[now].size();
for(long long i=0;i<L;i++){
long long e=T[now][i].to;
if(e!=lst){
wf[e][0]=T[now][i].p;
lca::dfs(e,now);
}
}
}
long long getlca(long long x,long long y){
if(ep[x]<ep[y]){
swap(x,y);
}
for(long long i=20;i>=0;i--){
if(ep[x]-(1ll<<i)>=ep[y]){
x=fa[x][i];
}
}
if(x==y) return x;
for(long long i=20;i>=0;i--){
if(fa[x][i]!=fa[y][i]){
x=fa[x][i];
y=fa[y][i];
}
}
return fa[x][0];
}
}
long long gtt(long long x,long long y,long long w){
long long nns=LLONG_MIN;
for(long long i=20;i>=0;i--){
if(ep[fa[x][i]]>=ep[y]){
if(w!=wf[x][i]) nns=max(w,wf[x][i]);
else nns=max(nns,Ws[x][i]);
x=fa[x][i];
}
}
return nns;
}
void solve(){
long long ess=LLONG_MAX;
for(long long i=1;i<=m;i++){
if(kt[i].fr==kt[i].to||vis[i]) continue;
if(mp[{kt[i].fr,{kt[i].to,kt[i].p}}]==1) continue;
long long lcaa=lca::getlca(kt[i].fr,kt[i].to);
long long mx=gtt(kt[i].fr,lcaa,kt[i].p);
long long my=gtt(kt[i].to,lcaa,kt[i].p);
ess=min(ess,ess-max(mx,my)+kt[i].p);
}
cout<<ess;
}
signed main(){
cin.tie(0)->sync_with_stdio(0);
cin>>n>>m;
for(long long i=1;i<=m;i++){
cin>>kt[i].fr>>kt[i].to>>kt[i].p;
}
//read
ksk();
lca::dfs(1,0);
solve();
return 0;
}
回复
共 4 条回复,欢迎继续交流。
正在加载回复...