93pts 求调
查看原帖
93pts 求调
1422328
TaoHongXi楼主2024/10/1 22:40
#define x first
#define y second

using namespace std;

typedef pair<int,int> PII;
typedef long long LL;
const int N = 100100, M = 300300, INF = 0x3f3f3f3f;
int idx, n, m;
vector<PII> G[N];
int dis1[N][17], dis2[N][17], fa[N][17];
int depth[N];
int f[N];

struct edge{
	int a, b, w;
	bool used = false;
	bool operator <(const edge &t)const{
		return w<t.w;
	}
} e[M];

void add(int a, int b, int w){
	G[a].push_back({w,b});
}

int find(int x){
	return f[x]==x?x:f[x]=find(f[x]);
}
LL kruskal(){
	LL ans = 0;
	sort(e,e+idx);
	for(int i=0;i<idx;i++){
		int a = find(e[i].a), b = find(e[i].b), w = e[i].w;
		if(a!=b){
			f[a] = b;
			e[i].used = true;
			ans+=w;
		}
	}
	return ans;
}

void build(){
	for(int i=0;i<m;i++){
		if(e[i].used){
			add(e[i].a,e[i].b,e[i].w);
			add(e[i].b,e[i].a,e[i].w);
		}
	}
}

void bfs(){
	memset(depth,0x3f,sizeof depth);
	depth[0] = 0;
	depth[1] = 1;
	queue<int> q;
	q.push(1);
	while(!q.empty()){
		int t = q.front();
		q.pop();
		for(int i=0;i<G[t].size();i++){
			int j = G[t][i].y, w = G[t][i].x;
			if(depth[j]>depth[t]+1){
				depth[j] = depth[t]+1;
				q.push(j);
				dis1[j][0] = w, dis2[j][0] = -INF;
				fa[j][0] = t;
				for(int k=1;k<=16;k++){
					int anc = fa[j][k-1];
					fa[j][k] = fa[anc][k-1];
					int dist[4] = {dis1[j][k-1],dis1[anc][k-1],dis2[j][k-1],dis2[anc][k-1]};
					dis1[j][k] = -INF, dis2[j][k] = -INF;
					for(int l=0;l<4;l++){
						if(dist[l]>dis1[j][k]) dis2[j][k] = dis1[j][k], dis1[j][k] = dist[l];
						else if(dist[l]!=dis1[j][k]&&dist[l]>dis2[j][k]){
							dis2[j][k] = dist[l];
						}
					}
				}
			}
		}
	}
}

int lca(int a, int b, int w){
	static int dist[2*N];
	int cnt = 0;
	if(depth[a]<depth[b]) swap(a,b);
	for(int k=16;k>=0;k--){
		if(depth[fa[a][k]]>=depth[b]){
			dist[cnt++] = dis1[a][k];
			dist[cnt++] = dis2[a][k];
			a = fa[a][k];
		}
	}
	if(a!=b){
		for(int k=16;k>=0;k--){
			if(fa[a][k]!=fa[b][k]){
				dist[cnt++] = dis1[a][k];
				dist[cnt++] = dis1[b][k];
				dist[cnt++] = dis2[a][k];
				dist[cnt++] = dis2[b][k];
				a = fa[a][k], b = fa[b][k];
			}
		}
		dist[cnt++] = dis1[a][0];
		dist[cnt++] = dis1[b][0];
	}
	int dist1 = -INF, dist2 = -INF;
	for(int i=0;i<cnt;i++){
			int d = dist[i];
			if(d>dist1) dist2 = dist1, dist1 = d;
			else if(d!=dist1&&d>dist2) dist2 = d;
	}
	if(w>dist1) return w-dist1;
	if(w!=dist1&&w>dist2) return w-dist2;
	return INF;
}
int main(){
	cin>>n>>m;
	int a, b, w;
	for(int i=1;i<=n;i++){
		f[i] = i;
	}
	for(int i=0;i<m;i++){
		scanf("%d%d%d",&a,&b,&w);
		if(a!=b){
			e[idx++] = {a,b,w};
		}
	}
	
	LL su = kruskal();
	
	//cout<<su<<endl;
	
	build();
	
	bfs();
	
	LL ans = 1e18;
	for(int i=0;i<idx;i++){
		if(!e[i].used){
			int p = lca(e[i].a, e[i].b, e[i].w);
			ans = min(ans,su+p);
		}
	}
	cout<<ans<<endl;
	return 0;
}
2024/10/1 22:40
加载中...