LCA,WA,求调,不知道哪里出问题,次小值挂
查看原帖
LCA,WA,求调,不知道哪里出问题,次小值挂
120438
Lacrymabre楼主2021/9/25 16:17
#include<iostream>
#include<cstdio>
#include<iomanip>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<stack>
#include<vector>
#include<map>

#define ll unsigned long long
#define db double
#define MAX 0x7fffffff
#define INF 0X3fffffff
#define N 100001<<1

using namespace std;

inline unsigned long long read()
{
    ll f=1,s=0;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9')s=(s<<1)+(s<<3)+ch-'0',ch=getchar();
    return s*f;
}

const ll inf=2147483647000000;
ll from[N],net[N],to[N],f[N][30],V[N];
ll maxx[N][30],minn[N][30];
ll n,m,tot,cnt,res,ans,last,cntt;
ll fa[N],dep[N],lg[N];
struct node {
	ll y,x,v,use;
}edge[3*N];

void add(ll x,ll y,ll v){
	to[++cnt]=y;
	V[cnt]=v;
	net[cnt]=from[x];
	from[x]=cnt;
}

ll find(ll x){
	if(fa[x]!=x) return fa[x]=find(fa[x]);
	return fa[x];
}

bool cmp(node a,node b){
	return a.v<b.v;
}

void dfs(ll u,ll fa){
	for(int i=1;i<=18;i++){
		f[u][i]=f[f[u][i-1]][i-1];
		maxx[u][i]=max(maxx[u][i-1],maxx[f[u][i-1]][i-1]);
		minn[u][i]=max(minn[u][i-1],minn[f[u][i-1]][i-1]);
		if(maxx[u][i-1]!=maxx[f[u][i-1]][i-1])
			minn[u][i]=max(minn[u][i],min(maxx[u][i-1],maxx[f[u][i-1]][i-1]));
		cout<<maxx[u][i]<<"&"<<minn[u][i]<<endl;
	}
	for(int i=from[u];i;i=net[i])
		if(!dep[to[i]]){
			f[to[i]][0]=u;
			maxx[to[i]][0]=V[i];
			minn[to[i]][0]=-inf;
			dep[to[i]]=dep[u]+1;
			dfs(to[i],u);
		}
}

ll LCA(ll x,ll y){
	if(dep[x]<dep[y]) swap(x,y);
	for(int i=18;i>=0;i--)
		if(dep[f[x][i]]>=dep[y]) x=f[x][i];
	if(x==y) return x;
	for(int i=18;i>=0;i--)
		if(f[x][i]^f[y][i]) x=f[x][i],y=f[y][i];
	return f[x][0];
}

ll romax(ll x,ll y,ll d){
	ll ans=-inf;
	for(int i=18;i>=0;i--)
		if(dep[f[x][i]]>=dep[y]){
			if(d!=maxx[x][i]) ans=max(ans,maxx[x][i]);
			else ans=max(ans,minn[x][i]);
			cout<<"*"<<ans<<endl;
			x=f[x][i];
		}
	return ans;
}

void kluskar(){
	for(int i=1;i<=n;i++) fa[i]=i;
	sort(edge+1,edge+m+1,cmp);
	for(int i=1;i<=m;i++){
		ll u=edge[i].x;
		ll v=edge[i].y;
		ll w=edge[i].v;
		if(find(u)!=find(v)){
			ans+=w;
			edge[i].use=1;
			add(u,v,w);
			add(v,u,w);
			fa[find(u)]=find(v);
		}
	}
}

int main(){
	n=read();m=read();
	for(int i=1;i<=m;i++) {edge[i].x=read();edge[i].y=read();edge[i].v=read();}
	kluskar();
	dep[1]=1;
	maxx[1][0]=0;
	minn[1][0]=-inf;
	dfs(1,0);
	ll last=inf;
	for(int i=1;i<=m;i++){
		ll u=edge[i].x;
		ll v=edge[i].y;
		ll w=edge[i].v;
		if(!edge[i].use){
			ll lca=LCA(u,v);
			ll a=romax(u,lca,w);
			ll b=romax(v,lca,w);
			last=min(last,ans-max(a,b)+w);
			cout<<i<<' '<<lca<<" "<<a<<" "<<b<<" "<<w<<endl;
		}
	}
//	cout<<find(1)<<" "<<find(2)<<" "<<find(3)<<" "<<find(4)<<" "<<find(5)<<endl;
	cout<<last;
	return 0;
}
2021/9/25 16:17
加载中...