奇怪的第6个点wa了 求助
查看原帖
奇怪的第6个点wa了 求助
561062
ww3331231楼主2022/9/11 23:56
#include<bits/stdc++.h>
using namespace std;
#define int long long 
const int N=3e5+5,INF=12345678900000000;
int n,m,b[N],top[N],fa[N],size[N],son[N],head[N],cnt,idx,pre[N],d[N],id[N],x,y,z,a[N],tot,minn,ans=INF;
bool vis[N];
struct Tree{
	int l,r,max1,max2;
}t[N<<2];
struct node{
	int from,to,nex,v;
}e[N<<2],c[N];
void add(int x,int y,int z)
{
	e[++cnt].to=y;
	e[cnt].nex=head[x];
	e[cnt].from=x;
	e[cnt].v=z;
	head[x]=cnt;
}
bool kru(node a,node b)
{
	return a.v<b.v;
}
void dfs1(int x,int f,int dep)
{
	d[x]=dep;
	size[x]=1;
	fa[x]=f;
	int maxson=-1;
	for(int i=head[x];i;i=e[i].nex)
	{
		int to=e[i].to;
		if(to==f)continue;
		b[to]=b[x]+e[i].v;
		dfs1(to,x,dep+1);
		size[x]+=size[to];
		if(size[to]>maxson)
		{
			maxson=size[to];
			son[x]=to;
		}
	}
}
void dfs2(int x,int tp)
{
	top[x]=tp;
	id[x]=++idx;
	a[idx]=b[x]-b[fa[x]];
	if(!son[x])return ;
	dfs2(son[x],tp);
	for(int i=head[x];i;i=e[i].nex)
	{
		int to=e[i].to;
		if(to==son[x]||to==fa[x])continue;
		dfs2(to,to);
	}
}
bool cmp(int a,int b)
{
	return a>b;
}
int get(int a,int b,int c,int d)
{
	int f[5]={a,b,c,d};
	sort(f,f+4,cmp);
	for(int i=1;i<4;i++)
	{
		if(f[i]!=f[0])return f[i];
	}
}
void up(int k)
{
	t[k].max1=max(t[k<<1].max1,t[k<<1|1].max1);
	t[k].max2=get(t[k<<1].max1,t[k<<1].max2,t[k<<1|1].max1,t[k<<1|1].max2);
}
void build(int k,int l,int r)
{
	t[k].l=l,t[k].r=r;
	if(l==r)
	{
		t[k].max1=a[l];
		return ;
	}
	int mid=(l+r)>>1;
	build(k<<1,l,mid);
	build(k<<1|1,mid+1,r);
	up(k);
}
Tree query(int k,int x,int y)
{
	if(t[k].l>=x&&t[k].r<=y)
	{
		return t[k];
	}
	int mid=(t[k].l+t[k].r)>>1;
	if(y<=mid)return query(k<<1,x,y);
	else
	{
		if(x>mid)return query(k<<1|1,x,y);
		else
		{
			Tree ans,t1,t2;
			t1=query(k<<1,x,y),t2=query(k<<1|1,x,y);
			ans.max1=max(t1.max1,t2.max1);
			ans.max2=get(t1.max1,t1.max2,t2.max1,t2.max2);
			return ans;
		}
	}
}
int lca(int x,int y,int w)
{
	int res=-INF;
    while(top[x]!=top[y])
	{
	//	printf("NMSLNSMLNSM\n");
	     if(d[top[x]]<d[top[y]])swap(x,y);
	     Tree tmp=query(1,id[top[x]],id[x]);
	     res=max(res,(tmp.max1==w)?tmp.max2:tmp.max1);
		 x=fa[top[x]];
    }	
    if(d[x]>d[y])swap(x,y);
    Tree tmp=query(1,id[x],id[y]);
    res=max(res,(tmp.max1==w)?tmp.max2:tmp.max1);
    return res;
}
int read()
{
	int x=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9')
	{
		if(c=='-')f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9')
	{
		x=(x<<1)+(x<<3)+(c^48);
		c=getchar();
	}
	return x*f;
}
int find(int x)
{
	if(pre[x]==x)return x;
	return pre[x]=find(pre[x]);
}
signed main()
{
	n=read(),m=read();
	for(int i=1;i<=n;i++)pre[i]=i;
	for(int i=1;i<=m;i++)
	{
		c[i].from=read(),c[i].to=read(),c[i].v=read();
	}
	
	sort(c+1,c+m+1,kru);
	int k=0;
	for(int i=1;i<=m;i++)
    {
    	int fax=find(c[i].from),fay=find(c[i].to);
    	if(fax!=fay)
    	{
    		pre[fax]=fay;
    		k++;
    		add(c[i].from,c[i].to,c[i].v);
    		add(c[i].to,c[i].from,c[i].v);
    		//printf("%lld %lld\n",c[i].from,c[i].to);
    		minn+=c[i].v;
    		vis[i]=true;
		}
		if(k==n-1)break;
	}
//	printf("%lld\n",minn);
	dfs1(1,0,1);
	dfs2(1,1);
	build(1,1,idx);
	for(int i=1;i<=m;i++)
	{
		if(vis[i])continue;
		int res=minn+c[i].v-lca(c[i].from,c[i].to,c[i].v);
	//	printf("res=%lld\n",res);
		if(res>minn&&res<ans&&res!=minn+e[i].v)
		ans=res;

	}
	printf("%lld",ans);
}
2022/9/11 23:56
加载中...