順序刪去圖中的邊,若不形成迴路則將此邊加入最小生成樹。
function find(v:integer):integer;
var i:integer;
begin
i:=1;
while (i< =n) and (not v in vset) do inc(i);
if i< =n then find:=i
else find:=0;
end;
procedure kruskal;
vartot,i,j:integer;
begin
for i:=1 to n do vset:=;
p:=n-1; q:=1; tot:=0;
sort;
while p >0 do
begin
i:=find(e[q].v1);j:=find(e[q].v2);
if i< >j then
begin
inc(tot,e[q].len);
vset:=vset+vset[j];vset[j]:=;
dec(p);
end;
inc(q);
end;
writeln(tot);
end;
5.最短路徑
a.標號法求解單源點最短路徑:
vara:array[1..maxn,1..maxn] of integer;
b:array[1..maxn] of integer;
mark:array[1..maxn] of boolean;
procedure bhf;
varbest,best_j:integer;
begin
fillchar(mark,sizeof(mark),false);
mark[1]:=true; b[1]:=0;
repeat
best:=0;
for i:=1 to n do
if mark then
for j:=1 to n do
if (not mark[j]) and (a[i,j] >0) then
if (best=0) or (b+a[i,j]< best) then
begin
best:=b+a[i,j]; best_j:=j;
end;
if best >0 then
begin
b[best_j]:=best;mark[best_j]:=true;
end;
until best=0;
end;
b.floyed演算法求解所有頂點對之間的最短路徑:
procedure floyed;
begin
for i:=1 to n do
for j:=1 to n do
if a[i,j] >0 then p[i,j]:=i else p[i,j]:=0;
for k:=1 to n do
for i:=1 to n do
for j:=1 to n do
if a[i,k]+a[j,k]< a[i,j] then
begin
a[i,j]:=a[i,k]+a[k,j];
p[i,j]:=p[k,j];
end;
end;
c. dijkstra 演算法:
類似標號法,本質為貪心演算法。
vara:array[1..maxn,1..maxn] of integer;
b,pre:array[1..maxn] of integer;
mark:array[1..maxn] of boolean;
procedure dijkstra(v0:integer);
begin
fillch
關於開方的迭代演算法
去年某司有一道面試題是不用 開根號計算開方,當時第一反應就是迭代逼近,但是對方還要求能不能把速度加快,先稍作總結。迭代逼近意思就是 我先隨便取乙個數,如果平方大於給定 n,那麼就取乙個小一點的 如果小了,那就取個大一點,最後達到精度要求即可。實現 class solution else x x 快速...
MATLAB中負實數開方的問題
在matlab中,對於乙個負實數開方,比如 8 1 3 有的matlab版本返回 2,而有的matlab版本返回三個值,包括兩個複數。這是因為matlab會在複數域求所有的解。如果只想獲得實數根,那麼可以使用 x nthroot 8,3 或者sign 8 abs 8.1 3 如果想一次性得到所有複數...
陌陌面試 演算法(估算開方)
二分法 import math from math import sqrt def sqrt binary num x sqrt num y num 2.0 min 0.0 max num 1.0 count 1 while abs y x 0.00000001 print count,y coun...