Rt 56pts 求调。
查看原帖
Rt 56pts 求调。
1045879
cheng2010楼主2024/7/30 07:13

有没有大神帮我看看,或出个 hack 数据。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+7;
int n,m;
struct Node
{
	bool pd;
	int frm,to,val;
	friend bool operator < (const Node A,const Node B){return A.val<B.val;}
}mp[N];
int fa[N];
int dep[N];
int MST;
int ans=1e18;
struct EDGE
{
	int frm,to,val;
}edge[N];
int cnt,head[N];
inline void add(int x,int y,int w)
{
	edge[++cnt].to=y;
	edge[cnt].frm=head[x];
	edge[cnt].val=w;
	head[x]=cnt;
}
int f[N][21];
int g1[N][21];
int g2[N][21];
inline int Find(int x){return fa[x]==x?x:fa[x]=Find(fa[x]);}
inline void dfs(int x,int fa)
{
	for(int i=head[x];i;i=edge[i].frm)
	{
		int v=edge[i].to;
		int w=edge[i].val;
		if(v==fa) continue;
		dep[v]=dep[x]+1;
		f[v][0]=x;
		g1[v][0]=w;
		g2[v][0]=-1e18;
		dfs(v,x);
	}
}
inline void init()
{
	for(int j=1;j<=20;j++)
	{
		for(int i=1;i<=n;i++)
		{
			f[i][j]=f[f[i][j-1]][j-1];
			g1[i][j]=max(g1[i][j-1],g1[f[i][j-1]][j-1]);
			g2[i][j]=max(g2[i][j-1],g2[f[i][j-1]][j-1]);
			if(g1[i][j-1]<g1[f[i][j-1]][j-1]) g2[i][j]=max(g2[i][j],g1[i][j-1]);
			else if(g1[i][j-1]>g1[f[i][j-1]][j-1]) g2[i][j]=max(g2[i][j],g1[f[i][j-1]][j-1]);
		}
	}
}
inline void LCA(int x,int y,int w)
{
	if(dep[y]>dep[x]) swap(x,y);
	int max1=-1,max2=-1;
	for(int i=20;i>=0;i--)
	{
		if(dep[f[x][i]]>=dep[y])
		{
			max1=max(max1,g1[x][i]);
			max2=max(max2,g2[x][i]);
			x=f[x][i];
		}
	}
	if(x==y)
	{
		if(max1!=w)
			ans=min(ans,MST-max1+w);
		else if(max2!=w&&max2>0)
			ans=min(ans,MST-max2+w);
		return; 
	}
	for(int i=20;i>=0;i--)
	{
		if(dep[f[x][i]]!=dep[f[y][i]])
		{
			max1=max(max1,max(g1[x][i],g1[y][i]));
			max2=max(max2,max(g2[x][i],g2[y][i]));
			x=f[x][i];
			y=f[y][i];
		}
	}
	max1=max(max1,max(g1[x][0],g1[y][0]));
	if(g1[x][0]!=max1) max2=max(max2,g1[x][0]);
	if(g1[y][0]!=max1) max2=max(max2,g1[y][0]);
	if(max1!=w)
		ans=min(ans,MST-max1+w);
	else if(max2!=w&&max2>0)
		ans=min(ans,MST-max2+w);
}
signed main()
{
	scanf("%lld %lld",&n,&m);
	for(int i=1;i<=n;i++) fa[i]=i;
	for(int i=1;i<=m;i++)
	{
		int x,y,w;
		scanf("%lld %lld %lld",&x,&y,&w);
		if(x==y) continue;
		mp[i].frm=x;
		mp[i].to=y;
		mp[i].val=w;
	}
	sort(mp+1,mp+1+m);
	for(int i=1;i<=m;i++)
	{
		int xx=Find(mp[i].frm);
		int yy=Find(mp[i].to);
		if(xx==yy) continue;
		fa[xx]=yy;
		MST+=mp[i].val;
		mp[i].pd=1;
		add(mp[i].frm,mp[i].to,mp[i].val);
		add(mp[i].to,mp[i].frm,mp[i].val);
	}
	dfs(1,0);
	init();
	for(int i=1;i<=m;i++)
		if(!mp[i].pd)
			LCA(mp[i].frm,mp[i].to,mp[i].val);
	printf("%lld\n",ans);
}
2024/7/30 07:13
加载中...