小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

MATLAB版本實(shí)現(xiàn)的Prim 和Kruskal算法

 Ethan的博客 2011-08-08

時(shí)間久遠(yuǎn),文檔又找不到了,我已經(jīng)忘記到底特色點(diǎn)具體在什么地方,歸結(jié)為一點(diǎn),就是充分利用了MATLAB語(yǔ)言的批量計(jì)算特性。直接貼代碼吧,有需要的人自然能看出名堂來(lái)。

 

prim
clear all;
close all;
Graph1;
%
調(diào)用Graph1M文件,產(chǎn)生圖1的鄰接矩陣
%Graph2;%
調(diào)用Graph2M文件,產(chǎn)生圖2的鄰接矩陣

len
=length(graph_adjacent);%
求圖中有多少個(gè)頂點(diǎn)
k
=sprintf('please input the point where you want to start ,do remember it must be between 1 and %d '
,len);
start_point
=input(k);%
輸入最小生成樹產(chǎn)生起點(diǎn)
while((start_point<=0)|(start_point>len))%
如果輸入的結(jié)點(diǎn)位置不合法即:小于等于零,或大于結(jié)點(diǎn)數(shù),則重新輸入
    disp(
'bad positon,please input again!'
);
    start_point
=
input(k);
end;
%************************************下面完成prim算法****************************

%相關(guān)變量初始設(shè)置
tree
=zeros(len-1,2);%
用于保存選入最小生成樹的邊
lowcost
=zeros(1,len);%用來(lái)保存集合V-U與集合U中頂點(diǎn)的最短邊權(quán)值,lowcost[v]=
0表示頂點(diǎn)v已經(jīng)
                   
%
加入最小生成樹中
adjvex
=zeros(1,len);%
用來(lái)保存依附于該邊在集合U中的節(jié)點(diǎn),U集合為生成最小生成樹的輔助集合,
                   
%首先U=
{start_point},之后依次確定為把最小生成樹的一邊的另一節(jié)點(diǎn)加入U(xiǎn)
                   
%
依次下去,直到圖的全部頂點(diǎn)都在U中能找到
               
lowcost
=graph_adjacent(start_point,:);%
lowcost(i)的值為節(jié)點(diǎn)i與start_point的權(quán)值;
adjvex
=start_point.*ones(1,len);%
adjvex中所有元素的值都為初始節(jié)點(diǎn)
%以下循n-1次,用于找出最小生成樹的len-
1條邊

for i=1:len-1

    k
=lowcost>0;%k為一邏輯數(shù)組,它和lowcost同維,對(duì)于每一個(gè)位置i1lowcost(i)>0則k(i)=1
                
%否則k(i)=0;稍候?qū)⒂眠@個(gè)數(shù)組進(jìn)行輔助尋址
    cost_min
=min(lowcost(k));%
找出lowcost中除0外的最小值
    index
=find(lowcost==cost_min);%
找出此最小值在lowcost中的下標(biāo),即找到相應(yīng)的節(jié)點(diǎn) 
    index
=index(1);%
因?yàn)樽钚≈档南聵?biāo)可能不止一個(gè),這里取第一個(gè)下標(biāo)進(jìn)行處理
    lowcost(index)
=0;%
表明該節(jié)點(diǎn)已經(jīng)加入了最小生成樹中
    tree(i,:)
=
[adjvex(index),index];
    
%
對(duì)lowcost和adjvex進(jìn)行更新
    
for j=1
:len
        
if lowcost(j)>
graph_adjacent(j,index);
            lowcost(j)
=
graph_adjacent(j,index);
            adjvex(j)
=
index;
        end
    end
end;

%*************************結(jié)果顯示模塊************************************

s
=0;
for ii=1:len-1

    k
=sprintf('最小生成樹第%d條邊:(%d,%d),權(quán)值為%d',ii,tree(ii,1),tree(ii,2),graph_adjacent(tree(ii,1),tree(ii,2)));%格式化字符串
    
%disp(k);%
顯示
    
%disp(' ');%
空一行
    s
=s+graph_adjacent(tree(ii,1),tree(ii,2));  %
求最小生成樹的代價(jià)
end
%
顯示最小生成樹的代價(jià)
disp(
'最小生成樹的總代價(jià)為:'
)
disp(s);

 

 

kruskal
clear all;
close all;
Graph11;
%
調(diào)用以鄰接矩陣儲(chǔ)存的圖所在的M文件
%
Graph22;

len
=length(graph_adjacent);%
計(jì)算圖中的頂點(diǎn)數(shù)
temp
=graph_adjacent;%
將原圖內(nèi)容拷貝到temp中,以防對(duì)原圖做改動(dòng)
superedge
=zeros(len-1,2);%
用于保存生成最小生成樹的邊
i
=1;%
指向superedge的下標(biāo)
for j=1
:len
 tag(j)
=j;%
關(guān)聯(lián)標(biāo)志初始化,將每個(gè)頂點(diǎn)的關(guān)聯(lián)標(biāo)志設(shè)為其本身
end;
%
以下的循環(huán)完成kruskal算法

while(superedge(len-1,1)==0
)
    [Y,I]
=sort(temp);%
將temp的每列按從小到大排序,數(shù)組Y保存temp 排序后的結(jié)果,I中保存相應(yīng)結(jié)果對(duì)應(yīng)的在temp中的下標(biāo)
    cost_min
=min(Y(1,:));%
找出權(quán)值最小的邊
    index
=find(Y(1,:)==cost_min);%
找出權(quán)值最小的邊對(duì)應(yīng)的頂點(diǎn)
    index
=index(1);%
一條邊對(duì)應(yīng)兩個(gè)節(jié)點(diǎn),且不同的邊的權(quán)值可能一樣,這里為了方便處理人為規(guī)定了順序,取標(biāo)號(hào)最小的頂點(diǎn)進(jìn)行處理
    anotherpoint
=I(1,index);%
找到該邊對(duì)應(yīng)的另一個(gè)頂點(diǎn)
    
%
將該邊對(duì)應(yīng)的權(quán)值修改為最大,防止該邊在下次循環(huán)中再次被選為最優(yōu)邊
    temp(index,anotherpoint)
=100
;
    temp(anotherpoint,index)
=100
;
    
if(tag(anotherpoint)~=tag(index))%
當(dāng)兩個(gè)點(diǎn)不屬于一個(gè)連通集時(shí),這兩個(gè)點(diǎn)之間的邊為最小生成樹的邊
        superedge(i,:)
=[index,anotherpoint];%
將其加入最小生成樹的邊集中
        i
=i+1;%
下標(biāo)加1
        
%
下面的語(yǔ)句的作用是將兩個(gè)連通分支變成一個(gè)連通分支,即tag值一樣
         
for j=1:len%
以index的tag值為標(biāo)準(zhǔn)
            
if((tag(j)==tag(anotherpoint))&(j~=anotherpoint))%
遍搜tag數(shù)組,先將和anotherpoint tag值一樣的點(diǎn)的tag值變?yōu)閕ndex的tag值
                tag(j)
=
tag(index);
            end
         end
        tag(anotherpoint)
=tag(index);%
將anotherpoint的tag值變?yōu)閕ndex的tag值                  
    end 
   
end

 
%*************************結(jié)果顯示模塊************************************

s
=0;
for ii=1:len-1

    k
=sprintf('最小生成樹第%d條邊:(%d,%d),權(quán)值為%d',ii,superedge(ii,1),superedge(ii,2),graph_adjacent(superedge(ii,1),superedge(ii,2)));%格式化字符串
    
%disp(k);%
顯示
    
%disp(' ');%
空一行
    s
=s+graph_adjacent(superedge(ii,1),superedge(ii,2));  %
求最小生成樹的代價(jià)
end
%
顯示最小生成樹的代價(jià)
disp(
'最小生成樹的總代價(jià)為:'
)
disp(s);

 

源碼下載:http://download.csdn.net/source/1030348

找到了以前寫的實(shí)驗(yàn)報(bào)告,也傳上去吧,這是一年半以前寫的,當(dāng)時(shí)還是個(gè)上大學(xué)的小P孩子,覺得代碼是最有用的東東,所以很多東西都只保存了代碼,沒有保存文檔,現(xiàn)在轉(zhuǎn)過(guò)頭來(lái)意識(shí)到了文檔的重要性。

文檔在:http://download.csdn.net/source/1963473

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多