关押罪犯

#include<bits/stdc++.h>
using namespace std; int m,n,b[10000001],zz[10000001]; struct date { int x,y,z; }a[10000001]; int find(int x) { if(zz[x]==x) return x; zz[x]=find(zz[x]); return zz[x]; } bool check(int a,int b) { a=find(zz[a]); b=find(zz[b]); if(a==b) return 1; return 0; } bool ccc(date a,date b) { return a.z>b.z; } void ad(int a,int b) { a=find(zz[a]); b=find(zz[b]); zz[a]=b; } int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) zz[i]=i;//为记录祖先做准备 for(int i=1;i<=m;i++) scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z);//记录数据 sort(a+1,a+m+1,ccc);//将仇恨值进行比较排序 for(int i=1;i<=m+1;i++)//为什么m+1呢?运行到m+1会输出0 { if(check(a[i].x,a[i].y)) { printf("%d",a[i].z); break; } //因为已经排过序,先把最大的搞定。如果两个罪犯已经在同一监狱就输出,并退出; //为什么会已经在同一监狱呢?我们在后面的程序里为了避免更大的冲突将部分人已经硬性分到了不同监狱, //在有超过两个敌人的一个人经过排序后依然遍历到了第二个敌人的情况下,这两个敌人只能分到一个监狱,无法避免冲突。 else { if(b[a[i].x]==0)//从重到轻,只标记头号“敌人”,其他的只有靠边站 b[a[i].x]=a[i].y; else ad(b[a[i].x],a[i].y);//将敌人的敌人合并,从此就有了共同祖先,必须在一个监狱,在一起了哈哈 if(b[a[i].y]==0) b

转载于:https://www.cnblogs.com/xxmxxm/p/10938713.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值