NOIP2010 关押罪犯

本文探讨了在S城两座监狱中分配罪犯的方法,以最小化因矛盾导致的冲突事件影响力,确保Z市长看到的冲突事件影响力最小。

http://vijos.org/p/1776

描述 Description
S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N。他们之间的关系自然也极不和谐。很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突。我们用“怨气值”(一个正整数值)来表示某两名罪犯之间的仇恨程度,怨气值越大,则这两名罪犯之间的积怨越多。如果两名怨气值为c 的罪犯被关押在同一监狱,他们俩之间会发生摩擦,并造成影响力为c 的冲突事件。
每年年末,警察局会将本年内监狱中的所有冲突事件按影响力从大到小排成一个列表,然后上报到S 城Z 市长那里。公务繁忙的Z 市长只会去看列表中的第一个事件的影响力,如果影响很坏,他就会考虑撤换警察局长。
在详细考察了N 名罪犯间的矛盾关系后,警察局长觉得压力巨大。他准备将罪犯们在两座监狱内重新分配,以求产生的冲突事件影响力都较小,从而保住自己的乌纱帽。假设只要处于同一监狱内的某两个罪犯间有仇恨,那么他们一定会在每年的某个时候发生摩擦。那么,应如何分配罪犯,才能使Z 市长看到的那个冲突事件的影响力最小?这个最小值是多少?

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

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

样例输入 SampleInput
4 6
1 4 2534
2 3 3512
1 2 28351
1 3 6618
2 4 1805
3 4 12884

样例输出 SampleOutput
3512

数据范围和注释 Hint
对于30%的数据有N≤ 15。
对于70%的数据有N≤ 2000,M≤ 50000。
对于100%的数据有N≤ 20000,M≤ 100000。

时间限制 TimeLimitation
各个测试点1s

解题报告
基于一个数不在另一个数的集合中,则必在其补集中的事实,以及本题中两个数同时在同一个数的补集中,则必定在对方的集合中的事实,可以构造两个并查集,分别表示i的集合与补集。之后将边按边权从大到小排序,依次将起点与终点添加到对方补集中。当出现矛盾时,即当前边的起点和终点都属于同一个点的补集,则当前边的权值即为所求。
代码中将a[n+1..2*n]作为点1..n的补集。

代码

View Code
 1 type
 2     qxx=record
 3         st,en,len:longint;
 4     end;
 5 var
 6     a:array[1..40001]of longint;
 7     e:array[1..100000]of qxx;
 8     m,n,i,j,k,l:longint;
 9 function get_f(p:longint):longint;
10 var
11     q:longint;
12 begin
13     q:=p;
14     while a[p]<>p do p:=a[p];
15     get_f:=p;
16     p:=q;
17     while a[q]<>get_f do begin
18         q:=a[q];
19         a[p]:=get_f;
20         p:=q;
21     end;
22 end;
23 procedure mapinput(x:longint);
24 var
25     r,s,t:longint;
26 begin
27     read(r,s,t);
28     e[x].st:=r;
29     e[x].en:=s;
30     e[x].len:=t;
31 end;
32 procedure qsort(ll,rr:longint);
33 var
34     l,r,x,y:longint;
35 begin
36     l:=ll;
37     r:=rr;
38     x:=e[(l+r)shr 1].len;
39     repeat
40         while e[l].len>x do inc(l);
41         while e[r].len<x do dec(r);
42         if l<=r then begin
43             y:=e[l].len;
44             e[l].len:=e[r].len;
45             e[r].len:=y;
46             y:=e[r].st;
47             e[r].st:=e[l].st;
48             e[l].st:=y;
49             y:=e[r].en;
50             e[r].en:=e[l].en;
51             e[l].en:=y;
52             inc(l);
53             dec(r);
54         end;
55     until l>r;
56     if (l<rr) then qsort(l,rr);
57     if (r>ll) then qsort(ll,r);
58 end;
59 begin
60     read(n,m);
61     for i:=1 to 2*n do a[i]:=i;
62     for i:=1 to m do mapinput(i);
63     qsort(1,m);
64     j:=1;
65     while (j<=m) do begin
66         if get_f(e[j].st)=get_f(e[j].en) then begin
67             writeln(e[j].len);
68             break;
69         end;
70         if get_f(e[j].st)<>get_f(e[j].en+n) then a[get_f(e[j].st)]:=get_f(e[j].en+n);
71         if get_f(e[j].en)<>get_f(e[j].st+n) then a[get_f(e[j].en)]:=get_f(e[j].st+n);
72         inc(j);
73     end;
74     if j>m then writeln('0');
75 end.

转载于:https://www.cnblogs.com/wangziyun/archive/2012/10/28/2743270.html

内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值