题意简述:给出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; }