bzoj 1050: [HAOI2006]旅行comf
2016-03-01 22:30
369 查看
program ddk; type ty=record x,y,z:longint; end; var a:array[1..500]of longint; b:array[0..5000]of ty; n,i,j,m,max,max1,min,min1,a1,a2,s,t:longint; procedure kuai(s,t:longint); var i,j,p:longint; begin i:=s; j:=t; p:=b[(s+t)div 2].z; repeat while b[i].z<p do inc(i); while b[j].z>p do dec(j); if j>=i then begin b[0]:=b[i]; b[i]:=b[j]; b[j]:=b[0]; inc(i); dec(j); end; until i>j; if i<t then kuai(i,t); if j>s then kuai(s,j); end; function zhao(a1:longint):longint; begin if a[a1]<>a1 then begin a[a1]:=zhao(a[a1]); exit(a[a1]); end else exit(a[a1]); end; function gcd(a1,a2:longint):longint; var a3:longint; begin repeat a3:=a1 mod a2; a1:=a2; a2:=a3; until a2=0; exit(a1); end; begin max:=9999999; min:=1; read(n,m); for i:=1 to m do read(b[i].x,b[i].y,b[i].z); kuai(1,m); read(s,t); for i:=1 to m do begin for j:=1 to n do a[j]:=j; max1:=b[i].z; min1:=0; for j:=i downto 1 do begin a1:=zhao(b[j].x); a2:=zhao(b[j].y); a[a2]:=a1; if zhao(s)=zhao(t) then begin min1:=b[j].z; break; end; end; if (min1<>0)and(max/min>max1/min1) then begin max:=max1; min:=min1; end; end; if max=9999999 then writeln('IMPOSSIBLE') else if max mod min=0 then writeln(max div min) else begin a1:=gcd(max,min); writeln(max div a1,'/',min div a1); end; end. 将边按权值排序之后,从小到大枚举最大边,用并查集维护s,t是否相连,刚相连是跳出,算出比值,不断更新答案
相关文章推荐
- dbo与db_owner区别
- python绘图:matplotlib和pandas的应用
- 学习笔记
- windows下使用pycharm配置python的virtualenv环境
- Android控件属性
- HBase源码分析之MemStore的flush发起时机、判断条件等详情
- cocos2d-x之使用plist文件初试
- MyEclipse 关闭拼写检查、JavaScript的检查Build、xml、JSP的Bulid检查
- 关于Linux的历史
- 在头文件中定义const类型
- linux基础概念与linux发展史
- 效率: 条款23 考虑使用其他程序库
- hud1569方格取数(2) (最大权独立集)
- [C语言][LeetCode][283]Move Zeroes
- 毕业设计第十五天
- 《leetCode》:Rotate Array
- Search a 2D Matrix II
- 快速掌握Lua 5.3 —— IO库 (1)
- Spring学习笔记2016-3-1
- 第一次试验-1