1樓:電燈劍客
為了減少不必要的麻煩,可以不妨設圖中所有邊的權重都不同,這樣最小生成樹版是唯權一的
然後直接用反證法就行了
如果prim演算法得到g,而最小生成樹是t
設在生成g的過程中第一次產生的不在t中的邊是e,而在g中去掉e得到的兩個連通分支記為v1和v2,那麼e連線了v1和v2
把e加入t之後會出現環,在這個環裡面v1的頂點和v2的頂點至少還被另一條邊f連線(否則t本身就不連通了),由prim演算法的貪心策略可知e比f權重低,那麼在t裡面把f換成e可得一個總權重更小的生成樹,與t的最小性矛盾
(因為最小生成樹的總權重的邊的權重的連續函式,對於有權重重複出現的情況可以利用連續性取極限,這樣即使最小生成樹不唯一仍然可以保證prim演算法生成的樹具有最小權重)
如何利用迴圈不變式證明演算法部分正確性
2樓:匿名使用者
就是個思想,說明正確演算法的迴圈過程中總是存在一個維持不變的特性,這個特性一直保持到迴圈結束乃至演算法結束,這樣就可以保證演算法的正確了。比方說插入排序,演算法每次迴圈後,前n個數一定是排好序的(n為已經迴圈的次數)。由於這個特性一直成
如何利用迴圈不變數證明演算法的部分正確性
3樓:坎平源廈
理論證明(要考慮種特殊情況),再實驗(用隨機數測試,再做排序誤檢測函式,通量實驗),應該.
如何證明這種歐幾里得演算法的正確性
4樓:蕭甜舔
歐幾里德演算法又稱輾轉相除法,用於計算兩個整數a,b的最大公約數.其計算原理依賴於下面的定理:
定理:***(a,b) = ***(b,a
mod b)
證明:a可以表示成a = kb +
r,則r = a mod b
假設d是a,b的一個公約數,則有
d|a,
d|b,而r = a - kb,因此d|r
因此d是(b,a
mod b)的公約數
假設d 是(b,a
mod b)的公約數,則
d | b ,d
|r ,但是a = kb +r
因此d也是(a,b)的公約數
因此(a,b)和(b,a mod
b)的公約數是一樣的,其最大公約數也必然相等,得證
歐幾里德演算法就是根據這個原理來做的,其演算法用c++語言描述為:
int***(int a,int b)
當然你也可以寫成迭代形式:
int***(int a,int b)
returna;}
本質上都是用的上面那個原理.
補充:擴充套件歐幾里德演算法是用來在已知a,
b求解一組x,y使得a*x+b*y=***(a,b)(解一定存在,根據數論中的相關定理).擴充套件歐幾里德常用在求解模線性方程及方程組中.下面是一個使
用c++的實現:
&y)int r =
ex***(b,a % b,x,y);
int t =
x;x =
y;y = t - a
/ b * y;
returnr;}
把這個實現和***的遞迴實現相比,發現多了下面的x,y賦值過程,這就是擴充套件歐幾里德演算法的精髓.
可以這樣思考:
對於a' = b,
b' = a % b 而言,我們求得 x,y使得 a'x + b'y = ***(a',b')
由於b' = a
% b = a - a / b * b (注:這裡的/是程式設計語言中的除法)
那麼可以得到:
a'x + b'y
= ***(a',b') ===>
bx + (a - a / b * b)y = ***(a',b') = ***(a,b)
===>
ay +b(x - a / b*y) = ***(a,b)
因此對於a和b而言,他們的相對應的p,q分別是
y和(x-a/b*y).
在網上看了很多關於不定方程方程求解的問題,可都沒有說全,都只說了一部分,看了好多之後才真正弄清楚不定方程的求解全過程,步驟如下:
求a * x
+ b * y = n的整數解.
1、先計算***(a,b),若n不能被***(a,b)整除,則方程無整數解;否則,在方程兩邊同時除以***(a,b),得到新的不定方程a'
* x + b' * y = n',此時***(a',b')=1;
2、利用上面所說的歐幾里德演算法求出方程a' * x + b' * y = 1的一組整數解x0,y0,則n' * x0,n' *
y0是方程a' * x + b' * y = n'的一組整數解;
3、根據數論中的相關定理,可得方程a'
* x + b' * y = n'的所有整數解為:
x = n' * x0 + b' * t
y = n' * y0 - a' * t
(t為整數)
上面的解也就是a * x + b * y = n 的全部整數解.
步驟如下:
擴充套件歐幾里德演算法-求解不定方程,線性同餘方程:
解不定方程ax + by = n的步驟如下:
(1)計算***(a,b).若***(a,b)不能整除n,則方程無整數解;否則,在方程的兩邊同除以***(a,b),
得到新的不定方程a'x + b'y = n',此時***(a',b') = 1
(2)求出不定方程a'x + b'y = 1的一組整數解x0,y0,則n'x0,n'y0是方程a'x + b'y = n'的一組整數解.
(3)根據&@^%w#&定理,可得方程a'x + b'y = n'的所有整數解為:
x = n'x0 + b't
y = n'y0 - a't
(t為整數)
這也就是方程ax + by = n的所有整數解
利用擴充套件的歐幾里德演算法,計算***(a,b)和滿足d = ***(a,b) = ax0 + by0的x0和y0,
也就是求出了滿足a'x0 + b'y0 = 1的一組整數解.因此可得:
x = n/d * x0 + b/d * t
y = n/d * y0 - a/d * t
(t是整數)
program oujilide;
var i,j,a,b,c,d,x,y:longint;
function ***(a,b:longint):longint;
var i:longint;
begin
if a=0 then exit(b);
if b=0 then exit(a);
***:=***(b,a mod b);
end;
procedure extend_***(a,b:longint;var x,y:longint);
var i,j:longint;
begin
if b=0 then
begin
x:=1;
y:=0;
exit
end;
extend_***(b,a mod b,x,y);
i:=x;
x:=y;
y:=i-(a div b)*x;
end;
begin
assign(input,'oujilide.in');
reset(input);
assign(output,'oujilide.out');
rewrite(output);
read(a,b,c);
d:=***(a,b);
if c mod d=0 then begin a:=a div d; b:=b div d; c:=c div d; end
else begin writeln('no answer!'); exit; end;
extend_***(a,b,x,y);
x:=c*x;
y:=c*y;
writeln(x,' ',y);
end.
承臺深度怎麼算,請教請教
這麼深奧的東西爾等凡人不會 你 不是標800的嗎 的計算方法只知道承臺的長寬,和基礎的深度,怎麼確 承臺底標高不一,挖土一般是按承臺標高相同數最多的來挖。還有一點,不能直接挖到承臺底標高的,需要留置20cm 30cm的土,後面用人工清理。鑽孔灌注樁樁底標高也不一,成孔深度是按樁的深度做的,不能統一。...
華碩b250m a支援超頻嗎,求華碩PRIME B250M A主機板的具體引數。
不支援。b250晶片組的主機板不支援超頻,華碩b250m a主機板cpu供電是3 2項,供電部分沒有散熱片,不如選b250m plus,還便宜一點,4 2項供電,供電部分還有散熱。b250m a一般是電商整機和線下實體店用的比較多,品牌溢價高,不划算。具體介紹 一 超頻簡介 電腦的超頻就是通過計算機...
鐵桶的重量怎麼算,請教鐵桶的重量問題
若是為計算鐵桶自重,那就設法求出鐵皮材質的體積,乘上比重即可。請教鐵桶的重量問題 你們是食品還是化工類呀?鐵桶既有材質又有尺寸型號的不同呀,這個比較難說,建議如下 1.如果鐵桶重量所佔比重不大,建議說服接受淨重 2.如果鐵桶重量所佔比重較大或者客戶不接受,建議統一採用鐵通重量的均值加淨重。裝卸肯定是...