当前位置:网站首页>C++邻接矩阵
C++邻接矩阵
2020-11-08 23:48:00 【WHICH工作室】
无向图和有向图在邻接矩阵中的表示方法:
无向图和有向图大同小异,在这里只以无向图为例,代码部分通过简单调整即可对应编译有向图
邻接矩阵数据类型定义
typedef struct{ //包含权的邻接矩阵的的定义
int Vertices[MaxVertices]; //顶点信息的数组
int Edge[MaxVertices][MaxVertices]; //边信息的数组
int n,e; //总顶点数,边数
}AMGraph;
以如关系图为例
根据上图,我们可以写出对应的邻接矩阵:
通过这个图可以看出,无向图对角线划分出来的两部分是互相对称的,由此即可通过创建无向图的邻接矩阵:
void CreateUDN(AMGraph &G) //图的生成函数
{
int i,j,n1,e1,vi,vj,w;
printf("请输入邻接矩阵的顶点数和边数:\n");
scanf("%d %d",&G.n,&G.e); //输入总顶点数,总边数
n1 = G.n;
e1 = G.e;
printf("请输入每个顶点的信息:\n");
for(i=0; i<n1; i++) //将顶点存入数组中
{
scanf("%d",&G.vexs[i]); //依次输入点的信息
}
for(i=0; i<n1; i++) //图的初始化
{
for(j=0; j<n1; j++)
{
if(i=j)
{
G.arcs[i][j] = 0; //顶点到自身的路径为0
}
else
{
G.arcs[i][j] = MaxWeight; //除顶点到自身外,其余均设为极大值
}
}
}
printf("\n");
//输入顶点从0开始
// for(i=0; i<e1; i++)
// {
// printf("请输入边的信息:\n");
// scanf("%d %d %d",&vi,&vj,&w);
// G.arcs[vi][vj] = w; //因为无向图是对称的,a[i][j] = a[j][i]
// G.arcs[vj][vi] = w;
// }
//输入顶点从1开始
for(i=0; i<e1; i++)
{
printf("请输入边的信息:\n");
scanf("%d %d %d",&vi,&vj,&w);
G.arcs[vi-1][vj-1] = w; // ① //因为无向图是对称的,a[i][j] = a[j][i]
G.arcs[vj-1][vi-1] = w; // ②
//无向图具有对称性的规律,通过①②实现
//有向图不具备此性质,所以只需要①
}
}
创建完无向图对应的邻接矩阵,我们需要对输出的格式进行一下控制,使其尽量按照普通手写的方式输出
void PrintfGraph(AMGraph G) //输出邻接矩阵的信息
{
int i,j;
printf("输出顶点的信息为:\n");
for(i=0; i<G.n; i++)
{
printf("%d\t",G.vexs[i]);
}
printf("\n邻接矩阵为:\n");
for(i=0; i<G.n; i++)
{
printf("\t%d",G.vexs[i]);
}
for(i=0; i<G.n; i++)
{
printf("\n%d\t",G.vexs[i]);
for(j=0; j<G.n; j++)
{
if(G.arcs[i][j] == MaxWeight) //两点之间无连接时权值为默认的32767,但输出时为了方便输出 "∞"
{
printf("%s\t","∞");
}
else
printf("%d\t",G.arcs[i][j]);
}
}
}
完整程序如下:
typedef int VerType;
typedef int ArcType;
typedef struct
{
VerType vexs[MaxVertices];
ArcType arcs[MaxVertices][MaxVertices];
int n,e;
} AMGraph;
void CreateUDN(AMGraph &G) //图的生成函数
{
int i,j,n1,e1,vi,vj,w;
printf("请输入邻接矩阵的顶点数和边数:\n");
scanf("%d %d",&G.n,&G.e); //输入总顶点数,总边数
n1 = G.n;
e1 = G.e;
printf("请输入每个顶点的信息:\n");
for(i=0; i<n1; i++) //将顶点存入数组中
{
scanf("%d",&G.vexs[i]); //依次输入点的信息
}
for(i=0; i<n1; i++) //图的初始化
{
for(j=0; j<n1; j++)
{
if(i=j)
{
G.arcs[i][j] = 0; //顶点到自身的路径为0
}
else
{
G.arcs[i][j] = MaxWeight; //除顶点到自身外,其余均设为极大值
}
}
}
printf("\n");
//输入顶点从0开始
// for(i=0; i<e1; i++)
// {
// printf("请输入边的信息:\n");
// scanf("%d %d %d",&vi,&vj,&w);
// G.arcs[vi][vj] = w; //因为无向图是对称的,a[i][j] = a[j][i]
// G.arcs[vj][vi] = w;
// }
//输入顶点从1开始
for(i=0; i<e1; i++)
{
printf("请输入边的信息:\n");
scanf("%d %d %d",&vi,&vj,&w);
G.arcs[vi-1][vj-1] = w; // ① //因为无向图是对称的,a[i][j] = a[j][i]
G.arcs[vj-1][vi-1] = w; // ②
//无向图具有对称性的规律,通过①②实现
//有向图不具备此性质,所以只需要①
}
}
void PrintfGraph(AMGraph G) //输出邻接矩阵的信息
{
int i,j;
printf("输出顶点的信息为:\n");
for(i=0; i<G.n; i++)
{
printf("%d\t",G.vexs[i]);
}
printf("\n邻接矩阵为:\n");
for(i=0; i<G.n; i++)
{
printf("\t%d",G.vexs[i]);
}
for(i=0; i<G.n; i++)
{
printf("\n%d\t",G.vexs[i]);
for(j=0; j<G.n; j++)
{
if(G.arcs[i][j] == MaxWeight) //两点之间无连接时权值为默认的32767,但输出时为了方便输出 "∞"
{
printf("%s\t","∞");
}
else
printf("%d\t",G.arcs[i][j]);
}
}
}
int main()
{
AMGraph G;
CreateUDN(G);
PrintfGraph(G);
}
运行结果如下:
有向图的邻接矩阵:
typedef struct
{
int vexs[MaxVertices];
int arcs[MaxVertices][MaxVertices];
int n,e;
}AMGraph;
void CreateGraph(AMGraph &G)
{
int n,e,i,j,vi,vj,w;
printf("请输入总顶点数和边数:\n");
scanf("%d %d",&G.n,&G.e);
n = G.n; e = G.e;
printf("请输入每个顶点的信息:\n");
for(i=0;i<n;i++)
{
scanf("%d",&G.vexs[i]);
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(i==j)
{
G.arcs[i][j] = 0; //顶点到自身的路径为0
}
else
{
G.arcs[i][j] = MaxWeight; //除顶点到自身外,其余均设为极大值
}
}
}
printf("\n");
//输入顶点从0开始
for(i=0;i<e;i++)
{
printf("请输入边的信息:\n");
scanf("%d %d %d",&vi,&vj,&w);
G.arcs[vi][vj] = w;
}
// //输入顶点从1开始
// for(i=0;i<e;i++)
// {
// printf("请输入边的信息:\n");
// scanf("%d %d %d",&vi,&vj,&w);
// G.arcs[vi-1][vj-1] = w;
// }
}
void PrintfGraph(AMGraph G) //输出邻接矩阵的信息
{
int i,j;
printf("输出顶点的信息为:\n");
for(i=0; i<G.n; i++)
{
printf("%d\t",G.vexs[i]);
}
printf("\n邻接矩阵为:\n");
for(i=0; i<G.n; i++)
{
printf("\t%d",G.vexs[i]);
}
for(i=0; i<G.n; i++)
{
printf("\n%d\t",G.vexs[i]);
for(j=0; j<G.n; j++)
{
if(G.arcs[i][j] == MaxWeight) //两点之间无连接时权值为默认的32767,但输出时为了方便输出 "∞"
{
printf("%s\t","∞");
}
else
printf("%d\t",G.arcs[i][j]);
}
}
}
int main()
{
AMGraph G;
CreateGraph(G);
PrintfGraph(G);
}
运行结果:
本文分享自微信公众号 - WHICH工作室(which_cn)。
如有侵权,请联系 [email protected] 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
版权声明
本文为[WHICH工作室]所创,转载请带上原文链接,感谢
https://my.oschina.net/u/4678692/blog/4708438
边栏推荐
- 老大问我:“建表为啥还设置个自增 id ?用流水号当主键不正好么?”
- Problem solving templates for subsequence problems in dynamic programming
- 构造回文的最小插入次数
- Part 1 - Chapter 2 pointer operation
- How to make scripts compatible with both Python 2 and python 3?
- 六家公司CTO讲述曾经历的“宕机噩梦”
- Pipedrive如何在每天部署50+次的情况下支持质量发布?
- Classical dynamic programming: longest common subsequence
- 寻找性能更优秀的不可变小字典
- APP 莫名崩溃,开始以为是 Header 中 name 大小写的锅,最后发现原来是容器的错!
猜你喜欢
随机推荐
JVM真香系列:轻松理解class文件到虚拟机(上)
接口测试工具Eolinker进行post请求
What courses will AI programming learn?
MYCAT build
APReLU:跨界应用,用于机器故障检测的自适应ReLU | IEEE TIE 2020
单例模式的五种设计方案
选择排序
非阻塞的无界线程安全队列 —— ConcurrentLinkedQueue
Programmers should know the URI, a comprehensive understanding of the article
如何将 PyTorch Lightning 模型部署到生产中
程序员都应该知道的URI,一文帮你全面了解
CMS垃圾收集器
Solve the failure of go get download package
动态规划之子序列问题解题模板
SQL语句的执行
200 programmers interview experience, all here
云计算之路-出海记-小目标:Hello World from .NET 5.0 on AWS
经典动态规划:最长公共子序列
存储过程动态查询处理方法
Why need to use API management platform