悬关求调
查看原帖
悬关求调
381806
Binaerbaka楼主2023/7/26 20:29
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=5e5+5;
const int INF=2147483647;
int n,m,fa[maxn][31],ans,vis1[maxn],st[maxn][31],s,f[maxn],deep[maxn],vis[maxn],st1[maxn][31];
struct node{
	int u,v,w;
}c[maxn];
struct e{
	int v,w;
};
bool cmp(node a,node b){
	return a.w<b.w;
}
vector<e>v[maxn];
void init(){
	for(int i=1;i<=n;i++)f[i]=i;
}
int find(int x){
	if(f[x]!=x)f[x]=find(f[x]);
	return f[x];
}
void kruskal(){
	for(int i=1;i<=m;i++){
		int a=c[i].u,b=c[i].v,k=c[i].w;
		int x=find(a),y=find(b);
		if(x!=y){
			ans+=k;
			v[a].push_back({b,k});
			v[b].push_back({a,k});
			vis1[i]=1;
			f[x]=y;
		}
	}
}
int LCA(int x,int y,int k){
	//cout<<x<<" "<<y<<endl;
	int mx=0;
	int mx1=0;
	if(deep[x]>deep[y])swap(x,y);
	for(int i=20;i>=0;i--){
		if(deep[fa[y][i]]<deep[x]) continue;
		mx=max(mx,st[y][i]);
		mx1=max(mx1,st1[y][i]);
		y=fa[y][i];
		//cout<<y<<" "<<i<<" "<<st[y][i]<<"\n";
	}
	if(x==y){
		if(k>mx)return k-mx;
		else return k-mx1;
	}
	for(int i=20;i>=0;i--){
		if(fa[x][i]!=fa[y][i]){
			mx=max(mx,st[x][i]),mx=max(mx,st[y][i]);
			mx1=max(mx1,st1[x][i]),mx1=max(mx1,st1[y][i]);
			x=fa[x][i],y=fa[y][i];
		}
	}
	mx=max(st[x][0],max(st[y][0],mx));
	mx1=max(st1[x][0],max(st1[y][0],mx1));
	if(k>mx)return k-mx;
	if(k>mx1) return k-mx1;
	return -1;
}
void dfs(int x){
	vis[x]=1;
	int sz=v[x].size();
	for(int i=0;i<sz;i++){
		int u=v[x][i].v;
		if(vis[u])continue;
		deep[u]=deep[x]+1;
		fa[u][0]=x;
		st[u][0]=v[x][i].w;
		//cout<<u<<" "<<v[x][i].w<<"\n";
		for(int i=1;i<=20;i++){
			fa[u][i]=fa[fa[u][i-1]][i-1];
			st[u][i]=max(st[u][i-1],st[fa[u][i-1]][i-1]);
			st1[u][i]=max(st1[u][i-1],st1[fa[u][i-1]][i-1]);
			if(st[u][i-1]>st[fa[u][i-1]][i-1])st1[u][i]=max(st1[u][i],st[fa[u][i-1]][i-1]);
			if(st[u][i-1]<st[fa[u][i-1]][i-1])st1[u][i]=max(st1[u][i],st[u][i-1]);
			//
			//cout<<u<<"-"<<i<<":max("<<st[u]
		}
		dfs(u);
	}
	return;
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr),cout.tie(nullptr);
	cin>>n>>m;
	init();
	for(int i=1;i<=m;i++)cin>>c[i].u>>c[i].v>>c[i].w;
	sort(c+1,c+1+m,cmp);
	kruskal();
	deep[1]=1;
	dfs(1);
	//cout<<st[3][1];
	//cout<<LCA(3,1);
//	return 0;
	int sum=9.2233720e+18;
	for(int i=1;i<=m;i++){
		if(vis1[i])continue;
		int a=c[i].u,b=c[i].v;
		int now=LCA(a,b,c[i].w);
		if(now>0)sum=min(sum,ans+now);
	}
	cout<<sum;
	return 0;
}

过不了第一个hack 第二hack能过

2023/7/26 20:29
加载中...