%Fleury算法:寻找欧拉回路,除非万不得已,否则不走割边
function T = myeuler(A,startp)
[T,~] = fleury3(A,startp);%
T = T';
function [T,sleds]=fleury3(A,startp)
[m,n]=size(A); % 返回A的行数和列数
if m~=n % 判断A是不是方阵 (~=:不等于)
fprintf('A不是方阵\n');
return;
end
temp=sum(A,1); % 返回各列求和的一个行向量
tteds=sum(temp); % 得到A各元素之和:同sum(sum(A))
sleds=0;
mtr = A;
eulerPath = startp;
while tteds ~= sleds
listNp = find(mtr(startp,:)==1); % 返回一个向量,该向量包含数组A第startp行的每个非零元素的线性索引。
nosNgbr = length(listNp); % 返回向量listNp的长度
if nosNgbr ==1
nextp = listNp(1); %此时(startp,nextp)是割边(桥)
else
for i=1:length(listNp)
flag = isGeBian(mtr,startp,listNp(i)); % 判断(startp,listNp)是不是割边(桥)
if flag~=1 %若是割边,则退出循环
break;
end
end
nextp = listNp(i); %情况1.break结束循环:此时(startp,nextp)是割边(桥)
disp(nextp);
disp(listNp);
end %情况2.自然结束循环
mtr(startp,nextp)=0; %情况1.先去掉割边(startp,nextp),除非万不得已,否则不走割边
mtr(nextp,startp)=0; %情况2.去掉后面的边,先走前面的边
eulerPath = [eulerPath, nextp];
startp = nextp;
sleds = sleds+1;
end
T = zeros(2,length(eulerPath)-1);
for i=2:length(eulerPath)
T(:,i-1) = [eulerPath(i-1);eulerPath(i)];
end
end
function flag=isGeBian(mtr,startp,nextp)%判断割边
mtr(startp, nextp) = 0;
mtr(nextp, startp) = 0;%假设边(startp, nextp)是割边,先去掉边(startp, nextp)
dui=[];
dui=enqueue(dui,startp); %将元素startp“入队”
while ~isempty(dui) %dui为空时停止循环
startp = dui(1); %取dui的第一个元素
dui=pop(dui); %删除dui的第一元素
listp=find(mtr(startp,:)==1); % 返回一个向量,该向量包含数组A第startp行的每个非零元素的线性索引。
if any(listp==nextp) %any(C):向量C所有的元素为0,any()才返回0;否则返回1
flag=0; %此时有其他的边,则(startp, nextp)不是割边
return;
% return 0
end
dui=enqueue(dui,listp);%拼接dui,listp两个列表(循环判断从startp到nextp有没有其他的边)
mtr(startp,listp)=0; %若startp为1,listp为[2,5],则此时mtr(1,2)和mtr(1,5)都赋值为0。(mtr是矩阵A )
end
flag=1;
end
function dui=enqueue(dui,p) %将p元素“入队”
if isempty(dui)%内置函数判断dui是否为空:为空则返回1,否则返回0
dui = p;
else
dui = [dui,p];%在数列dui后面增加元素p
end
end
function dui=pop(dui)%将第一个元素“出队”
if length(dui)==1
dui=[];
else
dui = dui(2:end);
end
end
end
11-01
1610
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
11-13
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交