all WA,悬关求调
查看原帖
all WA,悬关求调
1070708
Caged_Bird楼主2024/4/30 23:57
#include<bits/stdc++.h>
using namespace std;
struct e{
	int from,to,w;
}edge[300005];
bool used[300005];
struct node{
	int to,w;
};
struct kkksc03{
	int m,s;
};
int n,m,fa[100005],mst;
vector<node>tree[100005];
int pre[100005][25],depth[100005],maxn[100005][25],secn[100005][25],ans=2147483647; 
int find(int op){
	if(fa[op]==op)return op;
	return fa[op]=find(fa[op]);
}
bool cmp(e a,e b){
	return a.w<b.w;
}
void dfs(int op,int pa){
	pre[op][0]=pa;
	depth[op]=depth[pa]+1;
	for(int i=1;i<=20;i++){
		pre[op][i]=pre[pre[op][i-1]][i-1];
		maxn[op][i]=max(maxn[op][i-1],maxn[pre[op][i-1]][i-1]);
		if(maxn[op][i-1]!=maxn[pre[op][i-1]][i-1])secn[op][i]=max(max(secn[op][i-1],secn[pre[op][i-1]][i-1]),min(maxn[op][i-1],maxn[pre[op][i-1]][i-1]));
		else secn[op][i]=max(secn[op][i-1],secn[pre[op][i-1]][i-1]);
	}
}
kkksc03 lca(int a,int b){
	kkksc03 l;
	if(depth[a]<depth[b]){
		int c=a;
		a=b;
		b=c;
	}
	for(int i=20;i>=0;i--){
		if(depth[pre[a][i]]>=depth[b]){
			a=pre[a][i];
			l.m=max(l.m,maxn[a][i]);
			l.s=max(l.s,secn[a][i]);
		}
	}
	if(a==b)return l;
    for(int i=20;i>=0;i--){
        if(pre[a][i]!=pre[b][i]){
        	l.m=max(l.m,maxn[a][i]);
        	l.m=max(l.m,maxn[b][i]);
			l.s=max(l.s,secn[a][i]);
			l.s=max(l.s,secn[b][i]);
            a=pre[a][i];
            b=pre[b][i];
        }
    }
    return l;
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++)fa[i]=i;
	for(int i=1;i<=m;i++){
		cin>>edge[i].from>>edge[i].to>>edge[i].w;
	}
	sort(edge+1,edge+1+m,cmp);
	for(int i=1;i<=m;i++){
		if(find(edge[i].from)!=find(edge[i].to)){
			mst+=edge[i].w;
			used[i]=true;
			fa[find(edge[i].from)]=find(edge[i].to);
			tree[edge[i].from].push_back(node{edge[i].to,edge[i].w});
			tree[edge[i].to].push_back(node{edge[i].from,edge[i].w}); 
		}
	}
	dfs(1,0);
	for(int i=1;i<=m;i++){
		if(used[i])continue;
		kkksc03 temp=lca(edge[i].from,edge[i].to);
		if(edge[i].w>temp.m)ans=min(ans,mst+edge[i].w-temp.m);
		else ans=min(ans,mst+edge[i].w-temp.s);
	}
	cout<<ans;
	return 0;
}

马蜂可能不是很良好,样例过了,但全wa,还有负的输出。。。开longlong样例过不了。。。玄学。。。

2024/4/30 23:57
加载中...