应用图论作业.docx

上传人:b****6 文档编号:8081529 上传时间:2023-01-28 格式:DOCX 页数:14 大小:163.08KB
下载 相关 举报
应用图论作业.docx_第1页
第1页 / 共14页
应用图论作业.docx_第2页
第2页 / 共14页
应用图论作业.docx_第3页
第3页 / 共14页
应用图论作业.docx_第4页
第4页 / 共14页
应用图论作业.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

应用图论作业.docx

《应用图论作业.docx》由会员分享,可在线阅读,更多相关《应用图论作业.docx(14页珍藏版)》请在冰豆网上搜索。

应用图论作业.docx

应用图论作业

第一题:

自动生成图的邻接矩阵

算法:

我们首先从键盘上获取图的定点数和边数;根据定点数生成矩阵,把矩阵的初始值全部赋予0;在通过从第一条边开始循环,看边与定点的相联的编号,由于如果与g[i][j]想连接赋值为1,同时把g[j][i]赋值也为1;其他的全部保持默认的值,这样我们就可以得到邻居矩阵。

#include

intmain()

{

inti,j,t;

inta,b;

intg[50][50]={0,0};

printf("请输入图的定点数和边数:

");

scanf("%d%d",&a,&b);

for(i=1;i<=a;i++)

for(j=1;j<=a;j++)g[i][j]=0;

for(t=1;t<=b;t++)

{

printf("请输入两个连接定点编号:

");

scanf("%d%d",&i,&j);

g[i][j]=1;

g[j][i]=1;

}

for(i=1;i<=a;i++)

{

for(j=1;j<=a;j++)

{

printf("%3d",g[i][j]);

}

printf("\n");

}

return(0);

}

第二题:

生成关联矩阵

算法:

通过键盘中输入的边的条数和点的个数,我们生成一个矩阵,初始值我们全部赋0。

然后通过从提一条边开始循环,循环一条边时候,我们输入与边连接的两个顶点的序列,然后我们在对定点循环,如果输入的点的序列等于循环的点的序列就对这个坐标位置赋1,通过这两个for循环,我们就可以自动生成关联矩阵。

#include

intmain()

{

intg[50][50];

inti,j,k,a,b;

intm,n;

printf("请输入边数和定点数:

");

scanf("%d%d",&a,&b);

for(i=1;i<=a;i++)

{

printf("请输入与%d边相联的连个定点",i);

scanf("%d%d",&m,&n);

for(j=1;j<=b;j++)

{

if(j==m)g[i][j]=1;

elseif(j==n)g[i][j]=1;

elseg[i][j]=0;

}

}

for(i=1;i<=a;i++)

{

for(j=1;j<=b;j++)

printf("%4d",g[i][j]);

printf("\n");

}

return0;

}

第三题;邻接矩阵转换成关联矩阵

算法:

邻居矩阵我们按照第一题的思路一样生成,我们在定义一个矩阵l,我们对邻接矩阵的每个定点进行循环,从第一个定点i开始,如果检测到该定点与另个定点j连接,我们就对矩阵l赋值,l[f][j]赋值为1;同时由于对称性,我们同时对l[j][i]赋值为1;这样我们就完成了邻接矩阵到关联矩阵的自动转换。

#include

intmain()

{

inti,j,k,a,b,m,n;

intf=1;

intg[50][50];

intl[50][50]={0};

printf("请输入定点数目和边数:

");

scanf("%d%d",&a,&b);

for(i=1;i<=a;i++)

{

for(j=1;j<=a;j++)

g[i][j]=0;

}

for(k=1;k<=b;k++)

{

printf("请输入与%d边连接点的位置:

",k);

scanf("%d%d",&m,&n);

g[m][n]=1;

g[n][m]=1;

}

for(i=1;i<=a;i++)

{

for(j=1;j<=a;j++)

{

if(g[i][j]==1)

{

l[i][f]=l[f][i]=1;

f++;

}

}

}

printf("输出邻接矩阵:

");

printf("\n");

for(i=1;i<=a;i++)

{

for(j=1;j<=a;j++)

printf("%4d",g[i][j]);

printf("\n");

}

printf("\n");

printf("输出关联举证:

");

printf("\n");

for(i=1;i<=b;i++)

{

for(j=1;j<=a;j++)

printf("%4d",l[i][j]);

printf("\n");

}

return0;

}

第四题:

判断是否为连通图:

算法:

从键盘上获取a的邻接矩阵,然后我们通过m步转移的到转移矩阵b,最后我们通过可达矩阵的算法,计算出可达矩阵c,如果c矩阵中的所有元素为非零元素,这样我们就可以判断a所对应的图为连同图,如果c矩阵中有元素为0,则判定a所对应的图为非连同的。

#include

intmain()

{

intn,m,i,j,k;

inta[50][50],b[50][50]={0},c[50][5:

0];

printf("请输入顶点个数:

");

scanf("%d",&n);

printf("请输入图的邻接矩阵:

\n");

for(i=0;i

{

for(j=0;j

{

scanf("%d",&a[i][j]);

c[i][j]=a[i][j];

}

}

for(m=0;m

{

for(i=0;i

{

for(j=0;j

{

for(k=0;k

b[i][j]+=a[i][k]*a[k][j];

c[i][j]=c[i][j]+b[i][j];

}

}

}

for(i=0;i

{

for(j=0;j

{

if(c[i][j]==0)

{

break;

printf("此图为非连通图\n");

}

elseif((i==(n-1))&&(j==(n-1)))

{

if(c[i][j]!

=0)

printf("此图为连通图\n");

}

}

}

return(0);

}

 

5.判断图中是否有割点

算法:

我们通过键盘输入一个邻接矩阵,此方法同上,然后我们对这个邻接矩阵进行判断,除了定点之外,我们队主对角线上进行判断,如果判断褚对角线上确实存在0点,则认为是割点

,否则判定为非割点。

#include

intmain()

{

inti,j,t;

inta,b,c;

intg[50][50]={0,0};

printf("请输入图的定点数和边数:

");

scanf("%d%d",&a,&b);

for(i=1;i<=a;i++)

for(j=1;j<=a;j++)g[i][j]=0;

for(t=1;t<=b;t++)

{

printf("请输入两个连接定点编号:

");

scanf("%d%d",&i,&j);

g[i][j]=1;

g[j][i]=1;

}

for(i=1;i<=a;i++)

{

for(j=1;j<=a;j++)

{

printf("%3d",g[i][j]);

}

printf("\n");

}

for(c=1;c<=a;c++)

{

for(i=1;i<=a;i++)

{

for(j=i+1;j<=a;j++)

{

if(i!

=c&&j!

=c)

if(g[i][j]==0)

printf("%d是割点\n",c);

else

printf("%d不是割点\n",c);

continue;

}

}

}

return(0);

}

6.判断欧拉图

算法:

根据欧拉图的性质,我们知道欧拉图即使连通图,并且所以定点的度数之和为偶数,我们先根据以上的判断连通的算法判定,然后在判定定点度数之和就为偶数。

如果都满足这两个条件我们则认为是欧拉图。

#include

intmain()

{

intn,m,i,j,k;

intf,l;

intp=0;

inta[50][50],b[50][50]={0},c[50][50];

printf("请输入顶点个数:

");

scanf("%d",&n);

printf("请输入图的邻接矩阵:

\n");

for(i=1;i<=n;i++)

{

for(j=1;j<=n;j++)

{

scanf("%d",&a[i][j]);

c[i][j]=a[i][j];

}

}

for(m=1;m<=n-1;m++)

{

for(i=1;i<=n;i++)

{

for(j=1;j<=n;j++)

{

for(k=1;k<=n;k++)

b[i][j]+=a[i][k]*a[k][j];

c[i][j]=c[i][j]+b[i][j];

}

}

}

for(i=1;i<=n;i++)

{

for(j=1;j<=n;j++)

{

if(c[i][j]==0)

{

break;

/*printf("此图为非连通图\n");*/

f=0;

}

elseif((i==(n-1))&&(j==(n-1)))

{

if(c[i][j]!

=0)

f=1;

}

}

}

for(i=1;i<=n;i++)

{

for(j=1;j<=n;j++)

if(a[i][j]==1)

p++;

}

l=p%2;

if(l==0&&f==1)

printf("此图是欧拉图\n");

else

printf("此图不是连通图\n");

return(0);

}

7.求最短路径矩阵

算法:

输入每条边的权值,构造图的带权邻接矩阵A=[a(i,j)]。

即由矩阵D(0)=A,按一个公式,构造出矩阵D

(1);又用同样地公式由D

(1)构造出D

(2);……;最后又用同样的公式由D(n-1)构造出矩阵D(n)。

矩阵D(n)的i行j列元素便是i号顶点到j号顶点的最短路径长度,称D(n)为图的距离矩阵。

#include

intmain()

{

int

V,i,j,t,m,a[10][10]={0},b[10][10]={0};

printf("请输入该图的顶点数:

");

scanf("%d",&V);

for(i=1;i<=V;i++)

{

for(j=i+1;j<=V;j++)

{

printf("V%d-->V%d的权值为:

",i,j);

scanf("%d",&a[i][j]);

a[j][i]=a[i][j];

b[j][i]=b[i][j]=a[i][j];

}

}

for(m=1;m<=V-1;m++)

{

for(i=1;i<=V;i++)

{

for(j=1;j<=V;j++)

{

for(t=1;t<=V;t++)

{

if(a[i][t]!

=0&&b[t][j]!

=0)

{

if(a[i][j]!

=0&&a[i][t]+b[t][j]

a[i][j]=a[i][t]+b[t][j];

if(a[i][j]==0&&i!

=j)

a[i][j]=a[i][t]+b[t][j];

}

}

}

}

}

printf("该图的最短距离矩阵为:

\n");

for(i=1;i<=V;i++)

{

for(j=1;j<=V;j++)

printf("%3d",a[i][j]);

printf("\n");

}

return(0);

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 职业规划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1