cf1184E1

题意简述:给出n个点m条边的无向图,你可以修改第一条边的权值,使得他可能会处于一棵最小生成树中,问你第一条的权值最大(不超过1e9)可以改为多少

 

题解:不去使用第一条边去跑最小生成树,然后在跑的过程中,有一条边连接的两个联通分量与第一条连接是一样的,那么答案就是这条边的权值

如果最后没办法联通,说明第一条边是桥,答案是1e9

int fa[maxn];

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

int main(){
	int n,m;
	cin>>n>>m;
	vector<pair<int,pair<int,int>>> edge(m);
	for(int i=0;i<m;i++){
		cin>>edge[i].se.fi>>edge[i].se.se>>edge[i].fi;
	}	
	sort(edge.begin()+1,edge.end());
	for(int i=1;i<=n;i++)
		fa[i]=i;
	for(int i=1;i<edge.size();i++){
		int x=edge[i].se.fi,y=edge[i].se.se;
		int px=Find(x),py=Find(y);
		if(px!=py){
			int p1=Find(edge[0].se.fi),p2=Find(edge[0].se.se);
			if(p1==px&&p2==py) {
				cout<<edge[i].fi<<endl;return 0;
			}
			if(p1==py&&p2==px) {
				cout<<edge[i].fi<<endl;return 0;
			}
			fa[px]=py;
		}
	}
	cout<<(int)1e9<<endl;
}

  

posted on 2020-02-19 21:16  欣崽  阅读(176)  评论(0编辑  收藏  举报

导航