专栏文章

题解:P12222 [蓝桥杯 2023 国 Java B] 电动车

P12222题解参与者 1已保存评论 0

文章操作

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

当前评论
0 条
当前快照
1 份
快照标识符
@mipf2e80
此快照首次捕获于
2025/12/03 10:57
3 个月前
此快照最后确认于
2025/12/03 10:57
3 个月前
查看原文
思路:瞄一眼题目,是要求连通图中最大边权最小值,想到瓶颈生成树,再看到无向图(这里有个特殊性质,无向图中的瓶颈生成树一定是最小生成树),很容易联想到 Kruskal 算法中的最小生成树最大边。所以我们只需要按边排序后检查边是否联通,不联通连接即可,由于边排序过,所以最后一条连接的边即为树中边权最大的。
Code:
CPP
#include<bits/stdc++.h>
using namespace std;
struct dsu {
	vector<int>pa,size;
	int count;
	dsu(int n) {
		count = n;
		pa = size = vector<int>(n + 1, 1);
		iota(pa.begin(),pa.end(),0);
	}
	int find(int x) {
		return pa[x] == x ? x : pa[x] = find(pa[x]);
	}
	void merge(int x, int y) {
		x = find(x), y = find(y);
		if (x == y) return;
		if (size[x] < size[y]) swap(x, y);
		pa[y] = x;
		size[x] += size[y];
		count--;
	}
	bool pd(int x,int y) {
		return find(x) == find(y);
	}
};
struct edge{
	int u,v,w;
	bool operator < (const struct edge & rhs){
		return w<rhs.w;
	}
}e[200010];//按边排序
long long n,m,u,v,s,t,mi=INT_MAX;
vector<long long> g[200010];
long long node[200010],vis[200010];
int main(){
    cin>>n>>m;
    struct dsu uf(n);
    for(int i=1;i<=m;i++){
    	cin>>e[i].u>>e[i].v>>e[i].w;
	}
	sort(e+1,e+m+1);
	for(int i=1;i<=m;i++){
		if(uf.pd(e[i].u,e[i].v)){
			continue;//已经连通就放弃
		}else{
            uf.merge(e[i].u,e[i].v);
        }
        if(uf.count==1){
            cout<<e[i].w<<endl;//图已经联通,这是最后且最大的一条边
            return 0;
        }
	}
	cout<<"-1"<<endl;//没结束说明不联通
	return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...