应用图论作业.docx
《应用图论作业.docx》由会员分享,可在线阅读,更多相关《应用图论作业.docx(14页珍藏版)》请在冰豆网上搜索。
应用图论作业
第一题:
自动生成图的邻接矩阵
算法:
我们首先从键盘上获取图的定点数和边数;根据定点数生成矩阵,把矩阵的初始值全部赋予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;kb[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);
}