我们用“怨气值”(一个正整数值)来表示某两名罪犯之间的仇恨程度,
如果两名怨气值为 cc 的罪犯被关押在同一监狱,他们俩之间会发生摩擦,并造成影响力为 cc 的冲突事件。
每年年末,警察局会将本年内监狱中的所有冲突事件按影响力从大到小排成一个列表,然后上报市长那里。
市长只会去看列表中的第一个事件的影响力,
他准备将罪犯们在两座监狱内重新分配,以求产生的冲突事件影响力都较小, 问这个最小值?
扩展域并查集
#include <iostream> #include <algorithm> using namespace std ; const int N=1e5+6; struct T{ int x,y,z; }A[N]; int fa[N],m; int n; int find(int x){ return x==fa[x]?x:fa[x]=find(fa[x]); } void cmb(int x,int y){ int fx=find(x),fy=find(y); fa[fy]= fx; } int cmp(T &x,T &y){ return x.z>y.z; } signed main(){ cin>>n>>m; int i; for(i=1;i<=n;i++) fa[i]= i,fa[i+n]=i+n; for(i=1;i<=m;i++){cin>>A[i].x>>A[i].y>>A[i].z;} sort(A+1,A+1+m,cmp); for(i=1;i<=m;i++){ int fx = find(A[i].x) ,fy=find(A[i].y); if(fx==fy) { cout<<A[i].z<<endl; return 0;} cmb(A[i].x+n,A[i].y); cmb(A[i].y+n,A[i].x); } cout<<0<<endl; }