matlab实现求图的连通分量算法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

该算法主要是仿照c中利用先深搜索算法求图的连通分量的算法改写的。

该算法假设有20个点,1号和2、4号相连,2号和3号相连,5号和6、7号相连,8号和9号相连,其他点都是孤立点。

结果图如下:

代码如下:

clear

N_TASK=20; %N_TASK任务的总个数

%随机生成任务点的坐标

x=rand(N_TASK,1);

x=x*N_TASK;

y=rand(N_TASK,1);

y=y*N_TASK;

for i=1:N_TASK

z(i).x=x(i);

z(i).y=y(i);

z(i).mark=0;

z(i).next=0;

z(i).next(2)=0;

z(i).next(3)=0;

z(i).groupnumber=0;

end

%使用z的next域表示点的下一个连接点

z(1).next(1)=2;

z(2).next(1)=3;

z(1).next(2)=4;

z(5).next(1)=6;

z(5).next(2)=7;

z(8).next(1)=9;

%使用邻接矩阵表示点与点之间的链接关系

z_neighbors=zeros(N_TASK,N_TASK);

z_neighbors(1,2)=1;

z_neighbors(2,3)=1;

z_neighbors(1,4)=1;

z_neighbors(5,6)=1;

z_neighbors(5,7)=1;

z_neighbors(8,9)=1;

%使用递归的方法对图进行先深搜索求图的连通分量z=dfs_main(z);

%画点

for i=1:N_TASK

plot(z(i).x,z(i).y,'k*');

hold on

end

% 画出连线

x1=[z(1).x z(2).x];

y1=[z(1).y z(2).y];

x2=[z(2).x z(3).x];

y2=[z(2).y z(3).y];

x3=[z(1).x z(4).x];

y3=[z(1).y z(4).y];

x4=[z(5).x z(6).x];

y4=[z(5).y z(6).y];

x5=[z(5).x z(7).x];

y5=[z(5).y z(7).y];

x6=[z(8).x z(9).x];

y6=[z(8).y z(9).y];

plot(x1,y1,'r*-');

hold on

plot(x2,y2,'r*-');

hold on

plot(x3,y3,'r*-');

hold on

plot(x4,y4,'r*-');

hold on

plot(x5,y5,'r*-');

hold on

plot(x6,y6,'r*-');

hold on

grid on

function results = dfs_main(z)

k=0;

for i=1:20;

if(z(i).mark==0)

k=k+1;

fprintf('第%d个连通分量的顶点集为:\n{',k);

z=dfs(z,i);

fprintf('}\n');

end

end

results = z;

function results = dfs(z,i)

fprintf('%d',i);

z(i).mark=1;

k=1;

while(z(i).next(k)~=0)

p=z(i).next(k);

if(z(p).mark==0)

z=dfs(z,p);

end

k=k+1;

end

results=z;

相关文档
最新文档