【Kruskal】公路建设(Road.exe, 1s, 64M)
来源:互联网 发布:徐文长手对知俯 编辑:程序博客网 时间:2024/05/24 05:54
公路建设(Road.exe, 1s, 64M)
【问题描述】
A国是一个新兴的国家,有N个城市,分别编号为1,2.3…N。政府想大搞公路建设,提供了优惠政策:对于每一个投资方案的预计总费用,政府负担50%,并且允许投资的公司对过往的汽车收取连续5年的养路费。世界各地的大公司纷纷投资,并提出了自己的建设方案,他们的投资方案包括这些内容:公路连接的两座城市的编号,预计的总费用(假设他们的预计总师准确的)。你作为A国公路规划局的总工程师,有权利决定每一个方案是否接受。但是政府给你的要求是:
1)要保证各个城市之间都有公路直接或间接相连。
2)因为是新兴国家,政府的经济实力还不强。政府希望负担最少的费用。
因为大公司并不是同时提出方案,政府希望每接到一个方案,就可以知道当前需要负担的最小费用和接受的投资方案,以便随时开工。关于你给投资公司的回复可以等到开工以后再给。
注意:A国一开始是没有公路的。
【数据说明】A国的城市数目N<=500,投资的方案总数M<=2000。
【输入】输入文件名:Road.in
第1行有两个数字:N、M
第2行到第M+1行给出了各个投资方案,第i行的方案编号为i-1
编号小的方案先接到,一个方案占一行,每行有3个数字,分别是连接的两个城市编号a、b,和投资的预计总费用cost。
【输出】输出文件名:Road.out
输出文件共有M行。
每一行的第一个数字是当前政府需要负担的最少费用(保留1位小数),后面是X个数字,表示当前政府接受的方案的编号,不要求从小到大排列。但如果此时接受的所有投资方案不能保证政府的第一条要求,那么这一行只有一个数字0
【样例】
Road.in
Road.out
3 5
1 2 4
1 3 4
2 3 4
1 3 2
1 2 2
0
4.0 1 2
4.0 1 2
3.0 1 4
2.0 4 5
================================
kruskal
===========================
type node=record x,y,v,o:longint; end;var n,m:longint; fa:array[1..250000]of node; f_fa:array[1..250000]of longint; fa_s:longint; map:array[1..500,1..500]of longint; odd:array[1..500,1..500]of longint; ans_odd:array[1..250000]of longint; f_bo:array[1..500]of boolean;procedure init;begin assign(input,'road.in'); assign(output,'road.out'); reset(input); rewrite(output);end;procedure terminate;begin close(input); close(output); halt;end;function find(x:longint):longint;begin if f_fa[x]=x then exit(x) else begin f_fa[x]:=find(f_fa[x]); exit(f_fa[x]); end;end;procedure merge(a,b:longint);var x,y:longint;begin x:=find(a); y:=find(b); f_fa[x]:=y;end;procedure qsort(s,t:longint);var i,j:longint; x:longint; tem:node;begin x:=fa[(s+t)shr 1].v; i:=s; j:=t; repeat while x<fa[j].v do dec(j); while fa[i].v<x do inc(i); if i<=j then begin tem:=fa[i]; fa[i]:=fa[j]; fa[j]:=tem; inc(i); dec(j); end; until i>j; if i<t then qsort(i,t); if s<j then qsort(s,j);end;procedure main;var i,j,k:longint; x,y,z:longint; t:longint; fa_t,ans:longint;begin readln(n,m); fillchar(f_bo,sizeof(f_bo),true); fillchar(map,sizeof(map),$7); t:=0; for i:=1 to m do begin readln(x,y,z); if map[x,y]>z then begin map[x,y]:=z; odd[x,y]:=i; odd[y,x]:=i; if f_bo[x] then begin f_bo[x]:=false; inc(t); end; map[y,x]:=z; if f_bo[y] then begin f_bo[y]:=false; inc(t); end; end; if t<n then writeln(0) else if t=n then begin fa_s:=0; for j:=1 to n do for k:=j+1 to n do if map[j,k]<100000 then begin inc(fa_s); fa[fa_s].x:=j; fa[fa_s].y:=k; fa[fa_s].v:=map[j,k]; fa[fa_s].o:=odd[j,k]; end; qsort(1,fa_s); for j:=1 to n do f_fa[j]:=j; fa_t:=0; ans:=0; for j:=1 to fa_s do begin if fa_t=n-1 then break; if find(fa[j].x)<>find(fa[j].y) then begin inc(fa_t); ans_odd[fa_t]:=fa[j].o; ans:=ans+fa[j].v; merge(fa[j].x,fa[j].y); end; end; write(ans/2:0:1,' '); for j:=1 to fa_t do write(ans_odd[j],' '); writeln; end; end;end;begin init; main; terminate;end.
- 【Kruskal】公路建设(Road.exe, 1s, 64M)
- HDU 4081 Qin Shi Huang's National Road System(次小生成树-Kruskal)
- HDU 1598 find the most comfortable road (暴力+kruskal)
- HDU4081 Qin Shi Huang's National Road System【Kruskal】【次小生成树】
- 音阶(ljestvica/1S/64M)
- 波老师(teacher/1S/64M)
- 【看书】while(m)m&=m-1,s++;的解释
- 浅谈 offsetof(s,m)
- HDU 1598 find the most comfortable road 【枚举+(并查集)最小生成树Kruskal】
- 爆裂吧世界(world/1S/64M)
- A Meteorologist’s Road to Python (Part 1)
- HDOJ 1596 find the safest road (d||s)
- POJ3204( Ikki's Story I - Road Reconstruction)
- [JZOJ5060]公路建设
- 5060. 公路建设
- RDMA's Long Hard Road
- FZU 1627Revival's road
- FZU 1627 Revival's road
- hibernate 二级缓存
- jquery ui tabs详解(中文)
- SQL语句的添加、删除、修改多种方法
- itouch4g越狱过程中电脑竟然死机
- Linux管道与重定向
- 【Kruskal】公路建设(Road.exe, 1s, 64M)
- DiscuzX2文档目录文件说明(上)
- Servlet小结
- Audio recorder Silverlight 4 sample
- 左值 右值 初始化与赋值 声明与定义
- perl的文本替换功能
- Fixcel电子表单——前端动作脚本(二):页面加载
- iPad 2安全隐患:用智能套破解密码锁屏
- HttpServletResponse