7pts求助
查看原帖
7pts求助
482610
Mortidesperatslav楼主2023/12/29 19:51

看起来我其余点输出的都偏大?

#include<bits/stdc++.h>
using namespace std;
class edge {
	public:
		int nxt,to,val;
} e[200005];
class edge1 {
	public:
		int u,v,w,used;
} e1[300005];
int h[100005],cnt,n,m,fa[100005],f[100005][20],mx[100005][20],mx2[100005][20],dep[100005];
long long ans0;
void add(int u,int v,int w) {
	cnt++;
	e[cnt].nxt=h[u];
	e[cnt].to=v;
	e[cnt].val=w;
	h[u]=cnt;
}
bool cmp(edge1 a,edge1 b) {
	return a.w<b.w;
}
int find(int x) {
	if(fa[x]==x)return x;
	return fa[x]=find(fa[x]);
}
void kru() {
	sort(e1+1,e1+1+m,cmp);
	for(int i=1; i<=m; i++) {
		int u=find(e1[i].u),v=find(e1[i].v);
		if(!(u^v))continue;
		ans0+=e1[i].w;
		add(e1[i].u,e1[i].v,e1[i].w);
		add(e1[i].v,e1[i].u,e1[i].w);
		e1[i].used=1;
		fa[v]=u;
	}
}
void bdfs(int u) { //BinaryDFS
	dep[u]=dep[f[u][0]]=1;
	for(int i=1; i<=18; i++) {
		f[u][i]=f[f[u][i-1]][i-1];
		if(mx[u][i-1]==mx[f[u][i-1]][i-1]) {
			mx[u][i]=mx[u][i-1];
			mx2[u][i]=max(mx2[f[u][i-1]][i-1],mx2[u][i-1]);
		} else if(mx[u][i-1]>mx[f[u][i-1]][i-1]) {
			mx[u][i]=mx[u][i-1];
			mx2[u][i]=max(mx[f[u][i-1]][i-1],mx2[u][i-1]);
		} else {
			mx[u][i]=mx[u][i-1];
			mx2[u][i]=max(mx[u][i-1],mx2[f[u][i-1]][i-1]);
		}
	}
	for(int i=h[u]; i; i=e[i].nxt) {
		int v=e[i].to,c=e[i].val;
		if(v!=f[u][0]) {
			f[v][0]=u;
			mx[v][0]=c;
			bdfs(v);
		}
	}
}
int LCA(int u,int v) {
	if(dep[u]<dep[v])swap(u,v);
	for(int i=18; i+1; i--)if(dep[u]-dep[v]>=(1<<i))u=f[u][i]; //提到相同深度
	if(u==v)return u;
	for(int i=18; i+1; i--)if(f[u][i]!=f[v][i])u=f[u][i],v=f[v][i]; //倍增 LCA
	return f[u][0];//重点
}
long long calc(int u,int v,int w) {
	int l=LCA(u,v);
	int nm=0,nm2=0;
	for(int i=18; i>=0; i--) {
		if(dep[f[u][i]]>=dep[l]) {
			if(nm==mx[u][i])nm2=max(mx2[u][i],nm2);
			else if(nm>mx[u][i])nm2=max(mx[u][i],nm2);
			else {
				nm2=max(mx2[u][i],nm);
				nm=mx[u][i];
			}
			u=f[u][i];
		}
		if(dep[f[v][i]]>=dep[l]) {
			if(nm==mx[v][i])nm2=max(mx2[v][i],nm2);
			else if(nm>mx[v][i])nm2=max(mx[v][i],nm2);
			else {
				nm2=max(mx2[v][i],nm);
				nm=mx[v][i];
			}
			v=f[v][i];
		}
	}
	if(w!=nm)return ans0-nm+w;
	if(nm2)return ans0-nm2+w;
	return LLONG_MAX;
}
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m;
	for(int i=1; i<=m; i++)cin>>e1[i].u>>e1[i].v>>e1[i].w;
	for(int i=1; i<=n; i++)fa[i]=i;
	kru();
	bdfs(1);
	long long ans=LLONG_MAX;
	for(int i=1; i<=m; i++)if(!e1[i].used)ans=min(calc(e1[i].u,e1[i].v,e1[i].w),ans);
	cout<<ans;
}
2023/12/29 19:51
加载中...