【玄关】77pts WA on #11 TLE on #13
查看原帖
【玄关】77pts WA on #11 TLE on #13
369411
DANNNqwq楼主2024/8/5 10:13

rt,求条

#include <iostream>
#include <cstdio>
#include <algorithm>
#define fo(i,l,r) for(int i=(l);i<=(r);++i)
#define of(i,l,r) for(int i=(l);i>=(r);--i)
#define fin(f) freopen(f,"r",stdin)
#define fout(f) freopen(f,"w",stdout)
#define debug(...) cout<<__VA_ARGS__<<'\n'
#define fdbg(...) cout<<__VA_ARGS__<<' '
#define endl '\n'
using namespace std;
typedef long long ll;
constexpr int inf=0x3f3f3f3f;
constexpr ll INF=0x7fffffff;
constexpr int N=1e5+5;
constexpr int M=3e5+5;
struct Ed {int x,y,w;}ed[M];
struct Edge {int to,nxt,val;}e[M<<1];
int head[N],tot,n,m;
void add(int u,int v,int w) {
	e[++tot].to=v;
	e[tot].nxt=head[u];
	e[tot].val=w;
	head[u]=tot;
}
int fat[N];ll mst;bool fl[M];
int find(int x) {return x==fat[x]?x:find(fat[x]);}
void kru() {
	fo(i,1,n) fat[i]=i;
	sort(ed+1,ed+m+1,[](Ed x,Ed y){return x.w<y.w;});
	int cnt=0;
	fo(i,1,m) {
		int x=ed[i].x,y=ed[i].y,w=ed[i].w;
		int fx=find(x),fy=find(y);if(fx==fy) continue;
		fat[fx]=fy;
		cnt++;
		mst+=w;
		fl[i]=1;
		add(x,y,w);add(y,x,w);
		if(cnt==n-1) break;
	}
}
int lg[N],dep[N],fa[N][20],mx1[N][20],mx2[N][20];
void dfs(int u,int f,int w) {
	dep[u]=dep[f]+1;fa[u][0]=f;
	mx1[u][0]=w;mx2[u][0]=-inf;
	for(int i=head[u];i;i=e[i].nxt) {
		int v=e[i].to;if(v==f) continue;
		dfs(v,u,e[i].val);
	}
}
void dp() {
	lg[1]=0;fo(i,2,n) lg[i]=lg[i>>1]+1;
	fo(k,1,lg[n]) fo(i,1,n) {
		fa[i][k]=fa[fa[i][k-1]][k-1];
		mx1[i][k]=max(mx1[i][k-1],mx1[fa[i][k-1]][k-1]);
		mx2[i][k]=max(mx2[i][k-1],mx2[fa[i][k-1]][k-1]);
		if(mx1[i][k-1]<mx1[fa[i][k-1]][k-1]) mx2[i][k]=max(mx2[i][k],mx1[i][k-1]);
		if(mx1[i][k-1]>mx1[fa[i][k-1]][k-1]) mx2[i][k]=max(mx2[i][k],mx1[fa[i][k-1]][k-1]);
	}
}
int lca(int u,int v) {
	if(dep[u]<dep[v]) swap(u,v);
	of(k,lg[n],0) if(dep[fa[u][k]]>=dep[v]) u=fa[u][k];
	if(u==v) return u;
	of(k,lg[n],0) if(fa[u][k]!=fa[v][k]) u=fa[u][k],v=fa[v][k];
	return fa[u][0];
}
ll query(int u,int v,int mx) {
	ll res=-INF;
	of(k,lg[n],0) if(dep[fa[u][k]]>=dep[v]) {
		if(mx1[u][k]!=mx) res=max(res,1ll*mx1[u][k]);
		else res=max(res,1ll*mx2[u][k]);
		u=fa[u][k];
	}
	return res;
}
int main() {
	ios::sync_with_stdio(0);cin.tie(nullptr);
	cin>>n>>m;
	fo(i,1,m) cin>>ed[i].x>>ed[i].y>>ed[i].w;
	kru();
	dfs(1,0,0);dp();
	ll ans=INF;
	fo(i,1,m) {
		if(fl[i]) continue;
		int x=ed[i].x,y=ed[i].y,w=ed[i].w;
		int l=lca(x,y);
		ll mx=max(query(x,l,w),query(y,l,w));
		ans=min(ans,mst+w-mx);
	}
	cout<<ans<<endl;
	return 0;
}
2024/8/5 10:13
加载中...