社区讨论

WA80分求助

P4180[BJWC2010] 严格次小生成树参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mi7w363k
此快照首次捕获于
2025/11/21 04:34
4 个月前
此快照最后确认于
2025/11/21 04:34
4 个月前
查看原帖
CPP
#include<iostream>
#include<algorithm>
#include<vector>
#include<cmath>
#include<queue>
#include<cstdio>
using namespace std;
#define ll long long
ll n, m, h[100005], f[100005], fh[100005];
ll ft[100005], ch[100005][20][2], u[100005][20], vis[500005];
ll dp[100005], s, longa, longb;
ll pq[100005], f1, f2, f3, f4;
int zuxian(int x) {
	if(x==f[x]) return x;
	return f[x]=zuxian(f[x]);
}
struct AB {
	int a, b, c, n;
	bool operator < (const AB &A) const {
		return c < A.c;
	}
} d[1000005], mp[1000005];
//vector<int> mp[100005];
void charu(int a,int b,int c,int i) {
	d[i].a=a, d[i].b=b, d[i].c=c;
	d[i].n=h[a], h[a]=i;
}
void dfs(int k,int fa) {
	for(int i=fh[k]; i; i=mp[i].n) {
		if(!pq[i])continue;
		int p=mp[i].b;
		if(p!=fa) {
			dp[p]=dp[k]+1;
			ft[p]=k;
			u[p][0]=k;
			ch[p][0][0]=mp[i].c;
			dfs(p,k);
		}
	}
}
int LCA(int a,int b) {
	if(dp[a]<dp[b]) {
		int t=a;
		a=b;
		b=t;
	}
	for(int i=20; i>=0; i--) {
		if(dp[a]-(2<<i-1)>=dp[b]) a=u[a][i];
	}
	if(a==b) return a;
	for(int i=20; i>=0; i--) {
		if(u[a][i]!=u[b][i]) a=u[a][i], b=u[b][i];
	}
	return u[a][0];
}
void suan(int p,int a,int b) {
	int id=a; 
	for(int i=longa; i>=0; i--) {
		if(dp[id]-(2<<i-1)>dp[p]) {
			if(ch[id][i][0]>=f1) f1=ch[id][i][0];
			id=u[id][i];
		}
	}
	for(int i=longa; i>=0; i--) {
		if(dp[a]-(2<<i-1)>=dp[p]) {
			if(ch[a][i][0]<f1) f3=max(f3,ch[a][i][0]);
			else f3=max(f3,ch[a][i][1]);
			a=u[a][i];
		}
	}
	id=b; 
	for(int i=longb; i>=0; i--) {
		if(dp[id]-(2<<i-1)>=dp[p]) {
			if(ch[id][i][0]>f2) f2=ch[id][i][0];
			id=u[id][i];
		}
	}
	for(int i=longb; i>=0; i--) {
		if(dp[b]-(2<<i-1)>=dp[p]) {
			if(ch[b][i][0]<f2) f4=max(f4,ch[b][i][0]);
			else f4=max(f4,ch[b][i][1]);
			b=u[b][i];
		}
	}
}
int main() {
	freopen("tree4.in","r",stdin);
	int a, b, c;
	cin>>n>>m;
	for(int i=1; i<=m; i++) {
		scanf("%d%d%d", &a, &b, &c);
		charu(a,b,c,i);
	}
	for(int i=1; i<=n; i++) f[i]=i;
	sort(d+1,d+m+1);
	int k=0;
	for(int i=1; i<=m; i++) {
		a=d[i].a, b=d[i].b, c=d[i].c;
		if(zuxian(a)!=zuxian(b)) {
			s+=d[i].c;
			vis[i]=1;
			f[zuxian(a)]=zuxian(b);
			++k;
			pq[k]=pq[k+n]=1;
			mp[k].a=a,mp[k].b=b,mp[k].c=c,mp[k].n=fh[a],fh[a]=k;
			mp[k+n].a=b,mp[k+n].b=a,mp[k+n].c=d[i].c,mp[k+n].n=fh[b],fh[b]=k+n;
		}
	}
	u[1][0]=1, dp[1]=1;
	dfs(1,1);
	for(int i=1; i<=20; i++) {
		for(int j=1; j<=n; j++) {
			if(dp[j]-(2<<i-1)<1)continue;
			ch[j][i][0]=max(ch[j][i-1][0],ch[u[j][i-1]][i-1][0]);
			if(ch[j][i-1][0]==ch[u[j][i-1]][i-1][0]) ch[j][i][1]=max(ch[j][i-1][1],ch[u[j][i-1]][i-1][1]);
			else if(ch[j][i-1][0]>ch[u[j][i-1]][i-1][0]) ch[j][i][1]=max(ch[j][i-1][1],ch[u[j][i-1]][i-1][0]);
			else ch[j][i][1]=max(ch[j][i-1][0],ch[u[j][i-1]][i-1][1]);
			u[j][i]=u[u[j][i-1]][i-1];
		}
	}
	ll q=1e18;
	for(int i=1; i<=m; i++) {
		if(!vis[i]) {
			a=d[i].a, b=d[i].b, c=d[i].c;
			int p=LCA(a,b);
			longa=(int)log2(dp[a]-dp[p]), longb=(int)log2(dp[b]-dp[p]);
			suan(p,a,b);
			int first, second;
			if(f1>f2) first=f1, second=max(f2,f3); 
			else if(f1==f2) first=f1, second=max(f3,f4);
			else first=f2, second=max(f1,f4);
			if(first<c) q=min(q,s+c-first);
			else q=min(q,s+c-second);
		}
	}
	cout<<q;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...