博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【USACO】Watering Hole 2008 Oct
阅读量:5057 次
发布时间:2019-06-12

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

【算法】MST-Prim

①初步思路就是最小生成树,那么打井操作怎么办呢?

   打井操作可看做是尤一个超级水源引出水,且代价为Wi的操作,所以加一个“超级点”就可以了,接着MST

1 var  2     n,heapsize,now,i,j:integer;  3     temp,mst:longint;  4     v:array[1..301,1..301] of longint;  5     p:array[1..301] of integer;  6     a,place:array[1..301] of integer;  7     d:array[1..301] of longint;  8     done:array[1..301] of boolean;  9 procedure exchange(x,y:integer); 10 var 11     i,j,temp:integer; 12 begin 13     place[a[x]]:=y; 14     place[a[y]]:=x; 15     temp:=a[x];a[x]:=a[y];a[y]:=temp; 16 end; 17  18 procedure min_heapify(i:integer); 19 var 20     l,r,smaller:integer; 21 begin 22     l:=i shl 1; 23     r:=l+1; 24     smaller:=i; 25     if (d[a[l]]
<=heapsize) then smaller:=l; 26 if (d[a[r]]
<=heapsize) then smaller:=r; 27 if smaller<>i then 28 begin 29 exchange(smaller,i); 30 min_heapify(smaller); 31 end; 32 end; 33 34 procedure change(k:integer;x:longint); 35 var 36 i:integer; 37 begin 38 i:=k; 39 while (i>1)and(d[a[i shr 1]]>x) do 40 begin 41 exchange(i,i shr 1); 42 i:=i shr 1; 43 end; 44 end; 45 46 function extract_min:integer; 47 var 48 i:integer; 49 begin 50 extract_min:=a[1]; 51 a[1]:=a[heapsize]; 52 place[a[1]]:=1; 53 dec(heapsize); 54 min_heapify(1); 55 end; 56 57 procedure build_heap; 58 var 59 i:integer; 60 begin 61 for i:=n div 2 downto 1 do min_heapify(i); 62 end; 63 begin 64 assign(input,'water.in'); 65 reset(input); 66 assign(output,'water.out'); 67 rewrite(output); 68 readln(n); 69 fillchar(done,sizeof(done),false); 70 for i:=1 to n+1 do p[i]:=i; 71 for i:=2 to n+1 do 72 begin 73 readln(temp); 74 v[1,i]:=temp; 75 v[i,1]:=temp; 76 end; 77 for i:=2 to n+1 do 78 begin 79 for j:=2 to n+1 do 80 begin 81 read(temp); 82 v[i,j]:=temp; 83 v[j,i]:=temp; 84 end; 85 readln; 86 end; 87 88 for i:=1 to n+1 do place[i]:=i; 89 for i:=1 to n+1 do a[i]:=i; 90 for i:=1 to n+1 do d[i]:=maxlongint; 91 d[1]:=0; 92 heapsize:=n+1; 93 while heapsize<>0 do 94 begin 95 now:=extract_min; 96 done[now]:=true; 97 for i:=1 to n+1 do if not done[i] then 98 if (d[i]>v[i,now])and(v[i,now]<>0) then 99 begin100 d[i]:=v[i,now];101 change(place[i],v[i,now]);102 103 end;104 MST:=MST+d[now];105 106 end;107 writeln(mst);108 close(input);109 close(output);110 end.

 

转载于:https://www.cnblogs.com/OmegaIota/p/3256300.html

你可能感兴趣的文章
spice-gtk安装
查看>>
java面试之n+1问题
查看>>
echarts折线图
查看>>
js兼容性
查看>>
Random.Next
查看>>
sql 随笔
查看>>
Bootstrap多层模态框modal嵌套问题
查看>>
八大生物识别技术
查看>>
windows自带记事本导致文本文件(UTF-8编码)开头三个字符乱码问题
查看>>
Elasticsearch 基于 URL 的搜索请求
查看>>
Atitit. 最佳实践 QA----减少cpu占有率--cpu占用太高怎么办
查看>>
Android输入法扩展之外接键盘中文输入
查看>>
mybatis generator插件开发
查看>>
hibernate 多对多 最佳实践
查看>>
ios至于理解锚
查看>>
Windows下搭建Eclipse+Android4.0开发环境
查看>>
利用Excel批量高速发送电子邮件
查看>>
C#:总结页面传值几种方法
查看>>
HDU 1159 - Common Subsequence [最长公共子序列]
查看>>
Python学习总结
查看>>