博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[并查集][贪心]Luogu P1525 关押罪犯
阅读量:5217 次
发布时间:2019-06-14

本文共 2248 字,大约阅读时间需要 7 分钟。

题目描述

S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N。他们之间的关系自然也极不和谐。很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突。我们用“怨气值”(一个正整数值)来表示某两名罪犯之间的仇恨程度,怨气值越大,则这两名罪犯之间的积怨越多。如果两名怨气值为c 的罪犯被关押在同一监狱,他们俩之间会发生摩擦,并造成影响力为c 的冲突事件。

每年年末,警察局会将本年内监狱中的所有冲突事件按影响力从大到小排成一个列表,然后上报到S 城Z 市长那里。公务繁忙的Z 市长只会去看列表中的第一个事件的影响力,如果影响很坏,他就会考虑撤换警察局长。

在详细考察了N 名罪犯间的矛盾关系后,警察局长觉得压力巨大。他准备将罪犯们在两座监狱内重新分配,以求产生的冲突事件影响力都较小,从而保住自己的乌纱帽。假设只要处于同一监狱内的某两个罪犯间有仇恨,那么他们一定会在每年的某个时候发生摩擦。

那么,应如何分配罪犯,才能使Z 市长看到的那个冲突事件的影响力最小?这个最小值是多少?

输入输出格式

输入格式:

输入文件的每行中两个数之间用一个空格隔开。第一行为两个正整数N 和M,分别表示罪犯的数目以及存在仇恨的罪犯对数。接下来的M 行每行为三个正整数aj,bj,cj,表示aj 号和bj 号罪犯之间存在仇恨,其怨气值为cj。数据保证1<aj=<=bj<=N ,0 < cj≤ 1,000,000,000,且每对罪犯组合只出现一次。

 

输出格式:

共1 行,为Z 市长看到的那个冲突事件的影响力。如果本年内监狱中未发生任何冲突事件,请输出0。

 

输入输出样例

输入样例#1:
4 61 4 25342 3 35121 2 283511 3 66182 4 18053 4 12884
输出样例#1:
3512

说明

【输入输出样例说明】罪犯之间的怨气值如下面左图所示,右图所示为罪犯的分配方法,市长看到的冲突事件影响力是3512(由2 号和3 号罪犯引发)。其他任何分法都不会比这个分法更优。

【数据范围】对于30%的数据有N≤ 15。对于70%的数据有N≤ 2000,M≤ 50000。对于100%的数据有N≤ 20000,M≤ 100000。

题解

  • 看完题目,我们第一想法就是尽量将危害大的两个罪犯分在两个监狱里
  • 那么就是贪心的思想
  • 可以用并查集维护
  • 如果这两个罪犯已经分在不同监狱里,那么可以将敌人的敌人结合在自己这个并查集里
  • 如果发现两个罪犯无可避免在一个监狱里,只能输出了

代码

1 #include
2 #include
3 #include
4 using namespace std; 5 struct edge{
int x,y,z;}f[100005]; 6 int n,m,fa[20005],v[20005]; 7 bool cmp(edge a,edge b) { return a.z>b.z; } 8 int getfather(int x){ return fa[x]!=x?fa[x]=getfather(fa[x]):x; } 9 bool pd(int a,int b)10 {11 int x=getfather(a),y=getfather(b);12 return x==y;13 }14 int main()15 {16 scanf("%d%d",&n,&m);17 for (int i=1;i<=n;i++) fa[i]=i;18 for (int i=1;i<=m;i++) scanf("%d%d%d",&f[i].x,&f[i].y,&f[i].z);19 sort(f+1,f+m+1,cmp);20 for (int i=1;i<=m+1;i++)21 {22 if (pd(f[i].x,f[i].y)) { printf("%d\n",f[i].z); return 0; }23 else 24 {25 if (!v[f[i].x]) v[f[i].x]=f[i].y;26 else 27 {28 int a=getfather(fa[v[f[i].x]]),b=getfather(fa[f[i].y]);29 fa[a]=b;30 }31 if (!v[f[i].y]) v[f[i].y]=f[i].x;32 else 33 {34 int a=getfather(fa[v[f[i].y]]),b=getfather(fa[f[i].x]);35 fa[a]=b;36 }37 }38 }39 return 0;40 }

 

转载于:https://www.cnblogs.com/Comfortable/p/8585474.html

你可能感兴趣的文章
关于MFC中窗口的销毁
查看>>
bzoj 2007: [Noi2010]海拔【最小割+dijskstra】
查看>>
BZOJ 1001--[BeiJing2006]狼抓兔子(最短路&对偶图)
查看>>
C# Dynamic通用反序列化Json类型并遍历属性比较
查看>>
128 Longest Consecutive Sequence 一个无序整数数组中找到最长连续序列
查看>>
定制jackson的自定义序列化(null值的处理)
查看>>
auth模块
查看>>
Java使用FileReader(file)、readLine()读取文件,以行为单位,一次读一行,一直读到null时结束,每读一行都显示行号。...
查看>>
Elipse安装Spring Tool Suite
查看>>
javascript keycode大全
查看>>
前台freemark获取后台的值
查看>>
log4j.properties的作用
查看>>
滴滴快车历史奖励政策:含工作日和周末的高峰奖励、翻倍奖励【历史政策】...
查看>>
文件操作类2
查看>>
游戏偶感
查看>>
Leetcode: Unique Binary Search Trees II
查看>>
转载------------Python多线程学习
查看>>
phpcurl类
查看>>
Hadoop伪分布式搭建
查看>>
C++ FFLIB 之FFDB: 使用 Mysql&Sqlite 实现CRUD
查看>>