WA#12 HELP
查看原帖
WA#12 HELP
542879
_HCl_楼主2023/4/24 13:21

I don't now why I can't type Chinese on this computer.But please help me.

#include<bits/stdc++.h>
using namespace std;
struct nd {
	int u,v,w;
} a[300001];
struct nd2 {
	int v,w;
};
bool cmp(nd op1,nd op2) {
	return op1.w<op2.w;
}
int n,m;
long long sum,ans=LLONG_MAX;
int fa[100001],flag[100001],dep[100001],f[100001][22],g[100001][22],h[100001][22];
vector<nd2> tr[100001];
int fd(int x) {
	return fa[x]==x?x:fa[x]=fd(fa[x]);
}
void read() {
	int M;
	cin>>n>>M;
	m=0;
	for(int i=1; i<=M; ++i) {
		int u,v,w;
		cin>>u>>v>>w;
		if(u!=v)m++,a[m].u=u,a[m].v=v,a[m].w=w;
	}
}
void dfs(int u,int dad,int w) {
	dep[u]=dep[dad]+1;
	f[u][0]=dad,g[u][0]=w,h[u][0]=-1e9;
	for(int i=1; i<=20; ++i) {
		f[u][i]=f[f[u][i-1]][i-1];
		g[u][i]=max(g[u][i-1],g[f[u][i-1]][i-1]);
		h[u][i]=max(h[u][i-1],h[f[u][i-1]][i-1]);
		if(g[u][i-1]<g[f[u][i-1]][i-1])h[u][i]=max(h[u][i],g[u][i-1]);
		else if(g[u][i-1]>g[f[u][i-1]][i-1])h[u][i]=max(h[u][i],g[f[u][i-1]][i-1]);
	}
	for(int i=0; i<tr[u].size(); ++i) {
		if(tr[u][i].v==dad)continue;
		dfs(tr[u][i].v,u,tr[u][i].w);
	}
}
void kruskal() {
	sort(a+1,a+m+1,cmp);
	for(int i=1; i<=n; ++i)fa[i]=i;
	int res=0;
	for(int i=1; i<=m; ++i) {
		if(fd(a[i].u)!=fd(a[i].v)) {
			flag[i]=1;
			res++;
			sum+=a[i].w;
			fa[fd(a[i].u)]=fd(a[i].v);
			tr[a[i].u].push_back({a[i].v,a[i].w});
			tr[a[i].v].push_back({a[i].u,a[i].w});
		}
		if(res==n-1)break;
	}
}
int lca(int x,int y) {
	if(dep[x]<dep[y])swap(x,y);
	for(int i=20; i>=0; --i) {
		if(dep[f[x][i]]>=dep[y])x=f[x][i];
	}
	if(x==y)return x;
	for(int i=20; i>=0; --i) {
		if(f[x][i]!=f[y][i])x=f[x][i],y=f[y][i];
	}
	return f[x][0];
}
long long mx(int u,int v,int maxn) {
	long long ret=-1e9;
	for(int i=18; i>=0; --i) {
		if(dep[f[u][i]]>=dep[v])
		{
			if(g[u][i]==maxn)ret=max(ret,(long long)h[u][i]);
			else ret=max(ret,(long long)g[u][i]);
			u=f[u][i];
		}
	}
	return ret;
}
void calc() {
	for(int i=1; i<=m; ++i) {
		if(flag[i])continue;
		int w=a[i].w,u=a[i].u,v=a[i].v,p=lca(u,v);
		long long max1=mx(u,p,w),max2=mx(v,p,w);
		ans=min(ans,sum-max(max1,max2)+w);
	}
}
int main() {
	read();
	kruskal();
	dfs(1,0,0);
	calc();
	cout<<ans;
}

thanks so much

2023/4/24 13:21
加载中...