???痛不欲生
查看原帖
???痛不欲生
756747
Ithea686楼主2023/8/7 15:47

为什么就

#5

过不了
调一上午了
源代码:

#include <bits/stdc++.h>
using namespace std;

const int inf=2147483647;
struct edge{
	int u,v,w,i;
	friend bool operator <(edge x,edge y){
		return x.w<y.w;
	}
}st[300005];
struct ikun{
	int p,w,id;
	ikun() {};
	ikun(int P,int W,int Id){p=P;w=W;id=Id;}
};
vector<ikun> e[100005];
int n,m;
long long sum,ans=9223372036854775807;
int dep[100005];
int f[100005][18];
int g[100005][18][2];
int fa[100005];
bool vis[300005],vv[100005],flag[300005];

inline int in() {
    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 * 10 + c - 48, c = getchar();
    return x * f;
}

void init(int u,int fu){
	dep[u]=dep[fu]+1;
	for (int i=0;i<17;i++){
		f[u][i+1]=f[f[u][i]][i];
		g[u][i+1][0]=max(g[u][i][0],g[f[u][i]][i][0]);
		if (g[u][i][0]==g[f[u][i]][i][0]) g[u][i+1][1]=g[u][i][0];//max(g[u][i][1],g[f[u][i]][i][1]);
		else if (g[u][i][0]<g[f[u][i]][i][0]) g[u][i+1][1]=max(g[u][i][0],g[f[u][i]][i][1]);
		else if (g[u][i][0]>g[f[u][i]][i][0]) g[u][i+1][1]=max(g[u][i][1],g[f[u][i]][i][0]);
	}
	for (long unsigned int i=0;i<e[u].size();i++){
		int v=e[u][i].p,ww=e[u][i].w,iid=e[u][i].id;
		if (!vis[iid]||v==fu) continue;
		f[v][0]=u;
		g[v][0][0]=ww;
		g[v][0][1]=-inf;
		init(v,u);
	}
}

pair<int,int> lca(int u,int v){
	int da=0,ca=0;
	if (dep[u]<dep[v]) u^=v^=u^=v;
	for (int i=17;i>=0;i--){
		if (dep[f[u][i]]>=dep[v]) {
			if (g[u][i][0]>da) ca=max(da,g[u][i][1]),da=g[u][i][0];
			else if (g[u][i][0]==da) ca=da;
			else ca=max(ca,g[u][i][0]);
			u=f[u][i];
		}
		if (u==v) return make_pair(da,ca);
	}
	for (int i=17;i>=0;i--){
		if (f[u][i]!=f[v][i]||i==0){
			if (g[u][i][0]==g[v][i][0]) da=max(da,g[u][i][0]),ca=max(ca,g[v][i][0]);
			else if (g[u][i][0]>g[v][i][0]){
				if (g[u][i][0]>da) da=g[u][i][0],ca=max(ca,max(g[u][i][1],max(g[v][i][0],g[v][i][1])));
				else ca=max(ca,g[u][i][0]);
			}
			else if (g[u][i][0]<g[v][i][0]){
				if (g[v][i][0]>da) da=g[v][i][0],ca=max(ca,max(g[v][i][1],max(g[u][i][0],g[u][i][1])));
				else ca=max(ca,g[v][i][0]);
			}
			if (i!=0)u=f[u][i],v=f[v][i];
		}
	}
	return make_pair(da,ca);
}

int find(int x) {
    return fa[x] == x ? fa[x] : fa[x] = find(fa[x]);
}

int main(){
	n=in(),m=in();
	for (int i=1;i<=m;i++){
		int u,v,ww;
		u=in(),v=in(),ww=in();
		if (u==v) continue;
		e[u].push_back(ikun(v,ww,i));
		e[v].push_back(ikun(u,ww,i));
		st[i].u=u,st[i].v=v,st[i].w=ww,st[i].i=i;
	}
	sort(st+1,st+1+m);
	for (int i=1;i<=n;i++) fa[i]=i;
	for(int i=1,j=1;i<=m&&j<n;i++) {
		int u=st[i].u,v=st[i].v;
		int fu=find(u),fv=find(v);
		if (fu!=fv) 
			j++,fa[fu]=fv,vis[st[i].i]=1,sum+=st[i].w;
	}
	
	g[1][0][1]=-inf;
	init(1,0);
	
	for (int i=1;i<=n;i++){
		for (long unsigned int j=0;j<e[i].size();j++){
			int v=e[i][j].p,ww=e[i][j].w,iid=e[i][j].id;
			if (vis[iid]) continue;
			else if (flag[iid]) continue;
			pair<int,int> pr=lca(i,v);
			int saikyo=pr.first,tsugi=pr.second;
			if (ww>saikyo) 
				{if (sum-saikyo+ww!=sum) ans=min(ans,sum-saikyo+ww),flag[iid]=1;}
			else if (ww==saikyo)
				{if (sum-tsugi+ww!=sum) ans=min(ans,sum-tsugi+ww),flag[iid]=1;}
		}
	}
	
	printf("%lld",ans);
	
	return 0;
}
2023/8/7 15:47
加载中...