图的邻接矩阵的建立与输出

合集下载

有向图的邻接矩阵

有向图的邻接矩阵

有向图的邻接矩阵有向图的邻接矩阵设有向图,,。

令为邻接到的边的条数,称为D的邻接矩阵,记作。

为图7.12的邻接矩阵,不难看出:(1)(即第i行元素之和为的出度),。

(2)(即第j列元素之和为的入度),。

(3)由(1),(2)可知,为D中边的总数,也可看成是D中长度为1的通路总数,而为D中环的个数,即D中长度为1的回路总数。

D中长度大于等于2的通路数和回路数应如何计算呢,为此,先讨论长度等于2的通路数和回路数。

在图D中,从顶点到顶点的长度等于2的通路,中间必经过一顶点。

对于任意的k,若有通路,必有且,即。

反之,若D中不存在通路,必有或,即。

于是在图D中从顶点到顶点的长度等于2的通路数为:由矩阵的乘法规则知,正好是矩阵中的第i行与第j列元素,记,即就是从顶点到顶点的长度等于2的通路数,时,表示从顶点到顶点的长度等于2的回路数。

因此,即矩阵中所有元素的和为长度等于2的通路总数(含回路),其中对角线的元素和为长度等于2的回路总数。

根据以上分析,则有下面的推论。

定义有向图,,D中长度为的通路数和回路数可以用矩阵(简记)来表示,这里,其中,即则为顶点到顶点长度为的通路数,为到自身长度为的回路数。

中所有元素之和为D中长度为的通路数,而中对角线上元素之和为D中始于(终于)各顶点的长度为的回路数。

在图7.12中,计算,,如下:观察各矩阵发现,,,。

于是,D中到长度为,2的通路有3条,长度为3的通路有4条,长度为4的通路有6条。

由,可知,D中到自身长度为的回路各有1条(此时回路为复杂的)。

由于,所以D中长度为2的通路总数为10,其中有3条回路。

从上述分析,可得下面定理。

定理7.5 设为有向图D的邻接矩阵,,则中元素为到长度为的通路数,为D中长度为的通路总数,其中为D中长度为的回路总数。

若再令矩阵,,……,上面定理有下面推论。

推论设,则中元素为D中到长度小于等于的通路数,为D中长度小于等于的通路总数,其中为D中长度小于等于的回路总数。

数据结构课程设计-图的邻接矩阵

数据结构课程设计-图的邻接矩阵

数据结构课程设计报告设计题目:图的邻接矩阵存储结构院系计算机学院年级x 级学生xxxx学号xxxxxxxxxx指导教师xxxxxxxxx起止时间10-6/10-102013年10月10日目录1 需求分析 (3)2 概要设计 (4)2.1 ADT描述 (4)2.2程序模块结构 (5)2.3各功能模块 (6)3详细设计 (7)3.1类的定义 (7)3.2 初始化 (8)3.3 图的构建操作 (8)3.4 输出操作 (9)3.5 get操作 (9)3.6 插入操作 (10)3.7 删除操作 (10)3.8 求顶点的度操作 (11)3.10 判断连通操作 (12)3.11 主函数 (13)4 调试分析 (16)4.1调试问题 (16)4.2 算法时间复杂度 (16)5用户手册 (16)5.1 主界面 (16)5.2 创建图 (17)5.3插入节点 (17)5.4 深度优先遍历 (17)5.5 求各顶点的度 (18)5.6 输出图 (18)5.7 判断是否连通 (19)5.8 求边的权值 (19)5.9 插入边 (19)5.10 删除边 (20)结论 (20)参考文献 (20)摘要随着计算机的普及,涉及计算机相关的科目也越来越普遍,其中数据结构是计算机专业重要的专业基础课程与核心课程之一,为适应我国计算机科学技术的发展和应用,学好数据结构非常必要,然而要掌握数据结构的知识非常难,所以对“数据结构”的课程设计比不可少。

本说明书是对“无向图的邻接矩阵存储结构”课程设计的说明。

首先是对需求分析的简要阐述,说明系统要完成的任务和相应的分析,并给出测试数据。

其次是概要设计,说明所有抽象数据类型的定义、主程序的流程以及各程序模块之间的层次关系,以及ADT描述。

然后是详细设计,描述实现概要设计中定义的基本功操作和所有数据类型,以及函数的功能及代码实现。

再次是对系统的调试分析说明,以及遇到的问题和解决问题的方法。

然后是用户使用说明书的阐述,然后是测试的数据和结果的分析,最后是对本次课程设计的结论。

图的邻接矩阵及其应用——数学专业本科生学年论文

图的邻接矩阵及其应用——数学专业本科生学年论文

学年论文题目:图的邻接矩阵及其应用学院:数学与信息科学学院专业:数学与应用数学学生姓名:******学号:************指导教师:******图的邻接矩阵及其应用摘要:文章介绍了邻接矩阵的定义及一个重要的定理,揭示了A k 在图论中的实际意义,并运用邻接矩阵的方法解决了锁具装箱和商人过河两个问题[1],使复杂的问题简单易懂,且容易推广,体现出了邻接矩阵在实际生活中的应用价值;另外对邻接矩阵在图的最小生成树和关键路径等算法分析上的应用作了一定的探讨[2]. 关键词:图;有向图;无向图;连通图;邻接矩阵;最小生成树;关键路径1.图论中邻接矩阵(Adjacency Matrix )的定义图的邻接矩阵[3],是表示顶点之间相邻关系的矩阵[4].设G=(V ,E)是一个图,其中V={v 1,v 2,…,v n }.G 的邻接矩阵是一个具有下列性质的n 阶方阵:⑴ 图而言,邻接矩阵一定是对称的,而且对角线一定为零,有向图则不一定如此;⑵ 向图中,任一顶点i 的度为第i 列所有元素的和;在有向图中顶点i 的出度为第i 行所有元素的和,而入度为第i 列所有元素的和.如下图[5]中无向图G 5 和有向图G 6 的邻接矩阵分别为A l 和A2:2.图论中邻接矩阵的一个重要定理设G 是一个图, V(G)为G 的顶点集, E (G)为G 的边集。

G 中有n 个顶点v 1,v 2,…,v n ,A=(a ij )n ×n 为G 的邻接距阵,其中n j i G E v v G E v v a ji j i ij ,...,2,1,)(0)(1=⎪⎩⎪⎨⎧∉∈= 则我们可得到如下定理:定理1 设A(G) 为图G 的邻接距阵,则G 中从顶点v i 到顶点v j ,长度为k 的道路的条数为A k 中的i 行j 列元素.证 对 k 用数学归纳法k =1时,显然结论成立;假设 k 时,定理成立,考虑 k +1的情形.记 A l 的i 行 j 列元素为A (1)ij ≥2,因为A 1#A=A 1+1,所以nj l in j l i j l i l ij a a a a a a a +++=+...2211)1((1)而从v i 到v j 长为 k +1的道路无非是从v i 经 k 步到某顶点v l (1≤l ≤n),再从v l 走一步到v j ;由归纳假设从v i 到v l 长为 k 的道路共计a ij k 而从v l 到v j 长为 1的道路为a ij 条,所以长为k+1的从v i 经过k 步到v l 再经过一步到v j 的道路共有()()nl 1kij il lj l 1a a a +==∑ 条,即定理得证.3.图论中邻接矩阵的应用3.1锁具装箱问题某厂生产一种弹子锁具, 每个锁具的钥匙有5个槽,每个槽的高度从{1,2,3,4,5,6}6个数(单位从略) 中任取一数.由于工艺及其他原因,制造锁具时对5个槽的高度还有两个限制:至少有3个不同的数,相邻两槽的高度之差不能为5,满足以上条件制造出来的所有互不相同的锁具称为一批.销售部门在一批锁具中随意地取每60个装一箱出售.问每一批锁具有多少个,装多少箱.锁具装箱这个问题是一个排列组合的数学问题,但在这里我们用图论中的邻接矩阵方法来解决这个问题.每把锁都有5个槽,每个槽有6个高度,至少有三个不同高度的槽,且相邻槽高差不为5.我们先求出无相邻高差为5的锁具数量,再减去仅有一个两个槽高的锁具数目.先计算由1, 2, 3, 4, 5, 6构成无1, 6相邻的情况的数目.为此,构造一个6节点的图:将1, 2, 3, 4, 5, 6这6 个数作为6个节点,当两个数字可以相邻时,这两个节点之间加一条边,每个节点有自己到自己的一条边.我们得到了锁具各槽之间的关系示意图(图1)1 26 35 4图1该图的邻接矩阵为:邻接矩阵A 的所有元素之和表示两个槽高无1,6相邻的锁具的个数,每个无1, 6相邻的5 位数与图1中长度为4的一条链一一对应,如12345,11111,22335等.A 的k 次方A k 中各元素之和就是长度为k 的链的个数.事实上,从这个具体问题可以看出,A 2中第i 行第j 列的元素指从i 开始经过两条边到达j 的链数,即从i 开始经过一条边到k,再从k 经过一条边达到j, i 和j 就决定了中间顶点k 的数目.于是,利用Matlab 就很容易得到将A 4 中元素求和可得相邻高差不为5的锁具数为6306把,但这6306把锁具中包含了仅有一个两个槽高的锁具,需要从其中减去,需减去的锁具的个数为()()266+C 5122426--=其中,第一个6仅有1个槽高的锁具; 26C 为1, 2, 3, 4, 5,6这6个数中取两个的取法,但扣除1, 6这一种取法; ( 25-2)是5个槽高每个都有两种选择25,再减去都取相同数字的两种情况。

图基本算法图的表示方法邻接矩阵邻接表

图基本算法图的表示方法邻接矩阵邻接表

图基本算法图的表⽰⽅法邻接矩阵邻接表 要表⽰⼀个图G=(V,E),有两种标准的表⽰⽅法,即邻接表和邻接矩阵。

这两种表⽰法既可⽤于有向图,也可⽤于⽆向图。

通常采⽤邻接表表⽰法,因为⽤这种⽅法表⽰稀疏图(图中边数远⼩于点个数)⽐较紧凑。

但当遇到稠密图(|E|接近于|V|^2)或必须很快判别两个给定顶点⼿否存在连接边时,通常采⽤邻接矩阵表⽰法,例如求最短路径算法中,就采⽤邻接矩阵表⽰。

图G=<V,E>的邻接表表⽰是由⼀个包含|V|个列表的数组Adj所组成,其中每个列表对应于V中的⼀个顶点。

对于每⼀个u∈V,邻接表Adj[u]包含所有满⾜条件(u,v)∈E的顶点v。

亦即,Adj[u]包含图G中所有和顶点u相邻的顶点。

每个邻接表中的顶点⼀般以任意顺序存储。

如果G是⼀个有向图,则所有邻接表的长度之和为|E|,这是因为⼀条形如(u,v)的边是通过让v出现在Adj[u]中来表⽰的。

如果G是⼀个⽆向图,则所有邻接表的长度之和为2|E|,因为如果(u,v)是⼀条⽆向边,那么u会出现在v的邻接表中,反之亦然。

邻接表需要的存储空间为O(V+E)。

邻接表稍作变动,即可⽤来表⽰加权图,即每条边都有着相应权值的图,权值通常由加权函数w:E→R给出。

例如,设G=<V,E>是⼀个加权函数为w的加权图。

对每⼀条边(u,v)∈E,权值w(u,v)和顶点v⼀起存储在u的邻接表中。

邻接表C++实现:1 #include <iostream>2 #include <cstdio>3using namespace std;45#define maxn 100 //最⼤顶点个数6int n, m; //顶点数,边数78struct arcnode //边结点9 {10int vertex; //与表头结点相邻的顶点编号11int weight = 0; //连接两顶点的边的权值12 arcnode * next; //指向下⼀相邻接点13 arcnode() {}14 arcnode(int v,int w):vertex(v),weight(w),next(NULL) {}15 arcnode(int v):vertex(v),next(NULL) {}16 };1718struct vernode //顶点结点,为每⼀条邻接表的表头结点19 {20int vex; //当前定点编号21 arcnode * firarc; //与该顶点相连的第⼀个顶点组成的边22 }Ver[maxn];2324void Init() //建⽴图的邻接表需要先初始化,建⽴顶点结点25 {26for(int i = 1; i <= n; i++)27 {28 Ver[i].vex = i;29 Ver[i].firarc = NULL;30 }31 }3233void Insert(int a, int b, int w) //尾插法,插⼊以a为起点,b为终点,权为w的边,效率不如头插,但是可以去重边34 {35 arcnode * q = new arcnode(b, w);36if(Ver[a].firarc == NULL)37 Ver[a].firarc = q;38else39 {40 arcnode * p = Ver[a].firarc;41if(p->vertex == b) //如果不要去重边,去掉这⼀段42 {43if(p->weight < w)44 p->weight = w;45return ;46 }47while(p->next != NULL)48 {49if(p->next->vertex == b) //如果不要去重边,去掉这⼀段50 {51if(p->next->weight < w);52 p->next->weight = w;53return ;54 }55 p = p->next;56 }57 p->next = q;58 }59 }60void Insert2(int a, int b, int w) //头插法,效率更⾼,但不能去重边61 {62 arcnode * q = new arcnode(b, w);63if(Ver[a].firarc == NULL)64 Ver[a].firarc = q;65else66 {67 arcnode * p = Ver[a].firarc;68 q->next = p;69 Ver[a].firarc = q;70 }71 }7273void Insert(int a, int b) //尾插法,插⼊以a为起点,b为终点,⽆权的边,效率不如头插,但是可以去重边74 {75 arcnode * q = new arcnode(b);76if(Ver[a].firarc == NULL)77 Ver[a].firarc = q;78else79 {80 arcnode * p = Ver[a].firarc;81if(p->vertex == b) return; //去重边,如果不要去重边,去掉这⼀句82while(p->next != NULL)83 {84if(p->next->vertex == b) //去重边,如果不要去重边,去掉这⼀句85return;86 p = p->next;87 }88 p->next = q;89 }90 }91void Insert2(int a, int b) //头插法,效率跟⾼,但不能去重边92 {93 arcnode * q = new arcnode(b);94if(Ver[a].firarc == NULL)95 Ver[a].firarc = q;96else97 {98 arcnode * p = Ver[a].firarc;99 q->next = p;100 Ver[a].firarc = q;101 }102 }103void Delete(int a, int b) //删除以a为起点,b为终点的边104 {105 arcnode * p = Ver[a].firarc;106if(p->vertex == b)107 {108 Ver[a].firarc = p->next;109 delete p;110return ;111 }112while(p->next != NULL)113if(p->next->vertex == b)114 {115 p->next = p->next->next;116 delete p->next;117return ;118 }119 }120121void Show() //打印图的邻接表(有权值)122 {123for(int i = 1; i <= n; i++)124 {125 cout << Ver[i].vex;126 arcnode * p = Ver[i].firarc;127while(p != NULL)128 {129 cout << "->(" << p->vertex << "," << p->weight << ")";130 p = p->next;131 }132 cout << "->NULL" << endl;133 }134 }135136void Show2() //打印图的邻接表(⽆权值)137 {138for(int i = 1; i <= n; i++)140 cout << Ver[i].vex;141 arcnode * p = Ver[i].firarc;142while(p != NULL)143 {144 cout << "->" << p->vertex;145 p = p->next;146 }147 cout << "->NULL" << endl;148 }149 }150int main()151 {152int a, b, w;153 cout << "Enter n and m:";154 cin >> n >> m;155 Init();156while(m--)157 {158 cin >> a >> b >> w; //输⼊起点、终点159 Insert(a, b, w); //插⼊操作160 Insert(b, a, w); //如果是⽆向图还需要反向插⼊161 }162 Show();163return0;164 }View Code 邻接表表⽰法也有潜在的不⾜之处,即如果要确定图中边(u,v)是否存在,只能在顶点u邻接表Adj[u]中搜索v,除此之外没有其他更快的办法。

计算机软件技术基础_实验指导书

计算机软件技术基础_实验指导书

《计算机软件技术基础》实验指导书编写:XXX适用专业:电器工程与自动化通讯工程电子信息工程安徽建筑工业学院电子与信息工程学院2007年9月实验一:线性链表的建立、查找、插入、删除实验实验学时:2实验类型:验证实验要求:必修一、实验目的通过本实验的学习,要求学生能够通过单链表的存储结构,掌握单链表的基本操作,包括单链表的建立、查找、插入、删除、输出等操作。

通过本实验可以巩固学生所学的线性表知识,提高编程能力,为后继课程的学习奠定基础。

二、实验内容1、为线性表{10,30,20,50,40,70,60,90,80,100}创建一个带头结点的单链表;2、在该链表上查找值为50,65的结点,并返回查找结果(找到:返回在县新链表中的位置);3、在该链表上值为50的结点后,插入一个值为120的结点;4、删除该链表上值为70的结点。

写出各操作的实现函数,并上机验证。

三、实验原理、方法和手段使用带头结点的单链表的表示线性表,通过实验,熟悉链表的创建、查找、插入、删除、输出等是链表的基本操作。

具体如下:(1)首先定义单链表的节点结构;(2)在单链表创建过程中,首先初始化一个带头结点的空链表,对线性表中的各元素依次通过键盘输入、建立该元素结点、插入到单链表中,实现单链表的创建过程;结点的插入有头插入和尾插入两种方法,采用不同方法时应注意元素的输入顺序。

(3)查找过程可以从头结点开始,将待查找的数据依次与每个结点的数据域比较,匹配及查找成功,弱链表访问完未找到匹配的元素,则查找不成功。

为能够返回查找成功的结点位置,在链表的搜索过程中,应设置一个计数器,记录搜索结点的序号;(4)插入结点时,首先要通过查找算法,找到带插入结点的前驱结点,然后为带插入元素建立结点,通过指针的修改,将结点插入。

(5)删除结点时,首先要通过查找算法,找到待删除结点的前驱,然后通过指针的修改,将待删除结点从链表中卸下,释放该结点。

(6)以上操作的正确性,均可以通过链表的输出结果来验证。

数据结构与算法课程设计报告---图的算法实现

数据结构与算法课程设计报告---图的算法实现

数据结构与算法课程设计报告课程设计题目:图的算法实现专业班级:信息与计算科学1002班目录摘要 (1)1、引言 (1)2、需求分析 (1)3、概要设计 (2)4、详细设计 (4)5、程序设计 (10)6、运行结果 (18)7、总结体会 (19)摘要(题目): 图的算法实现实验内容图的算法实现问题描述:(1)将图的信息建立文件;(2)从文件读入图的信息,建立邻接矩阵和邻接表;(3)实现Prim、Kruskal、Dijkstra和拓扑排序算法。

关键字:邻接矩阵、Dijkstra和拓扑排序算法1.引言本次数据结构课程设计共完成图的存储结构的建立、Prim、Kruskal、Dijkstra 和拓扑排序算法等问题。

通过本次课程设计,可以巩固和加深对数据结构的理解,通过上机和程序调试,加深对课本知识的理解和熟练实践操作。

(1)通过本课程的学习,能够熟练掌握数据结构中图的几种基本操作;(2)能针对给定题目,选择相应的数据结构,分析并设计算法,进而给出问题的正确求解过程并编写代码实现。

使用语言:CPrim算法思想:从连通网N={V,E}中的某一顶点v0出发,选择与它关联的具有最小权值的边(v0,v),将其顶点加入到生成树的顶点集合V中。

以后每一步从一个顶点在V中,而另一个顶点不在V中的各条边中选择权值最小的边(u,v),把它的顶点加入到集合V中。

如此继续下去,直到网中的所有顶点都加入到生成树顶点集合V中为止。

拓扑排序算法思想:1、从有向图中选取一个没有前驱的顶点,并输出之;2、从有向图中删去此顶点以及所有以它为尾的弧;重复上述两步,直至图空,或者图不空但找不到无前驱的顶点为止。

没有前驱-- 入度为零,删除顶点及以它为尾的弧-- 弧头顶点的入度减1。

2.需求分析1、通过键盘输入建立一个新的有向带权图,建立相应的文件;2、对建立的有向带权图进行处理,要求具有如下功能:(1)用邻接矩阵和邻接表的存储结构输出该有向带权图,并生成相应的输出结果;(2)用Prim、Kruskal算法实现对图的最小生成树的求解,并输出相应的输出结果;(3)用Dijkstra算法实现对图中从某个源点到其余各顶点的最短路径的求解,并输出相应的输出结果;(4)实现该图的拓扑排序算法。

生成邻接矩阵的方法

生成邻接矩阵的方法

生成邻接矩阵的方法复杂网络中常常需要将得到的关系对(图一)转换为邻接矩阵,并存储为csv格式。

本文将介绍两方法来进行处理:方法一是构建数据框赋予值。

方法二是利用pivot () 函数将一维表转换为二维表。

本文所采用的例子为有向加权网络。

首先我们的原始数据为关系对(图一):因此可以看到节点列为node1和node2,权重列为weight。

接下来转换为邻接矩阵。

方法一:构建数据框并赋予值原理:这个方法是提取出列作为节点,然后进行对应的值输入,形成邻接矩阵。

代码:import pandas as pdimport numpy as np#导入你的数据data = pd.read_csv('./yourdata.csv')vals = np.unique(data[['origin_x', 'origin_y']]) # 同时取出两列,作为节点df = pd.DataFrame(0, index=vals, columns=vals)f = df.index.get_indexerdf.values[f(data.origin_x), f(data.origin_y)] = 1print(df)输出结果:方法二:pivot函数生成邻接矩阵的方法 4index:转换后邻接矩阵的行索引。

在本例中为node1。

columns:转换后邻接矩阵的列。

在本例中为node2.values:邻接矩阵的权重。

如果没有权重时可以不写这个参数。

在本例中为weight。

代码:import pandas as pdimport numpy as np#导入你的数据data = pd.read_csv('./yourdata.csv')#转换为邻接矩阵用pivot()df =data.pivot(index='node1',columns='node2',values='weigh t')#index为行索引,columns为列索引,values是矩阵中填充的值df = df.reset_index()df.fillna(0,inplace=True)print(df)得到的结果:对于此方法来说,它是根据节点的值形状变化的,第一种方法一定会形成一个对称的邻接矩阵。

实现图的遍历算法实验报告

实现图的遍历算法实验报告

实现图的遍历算法实验报告实现图的遍历算法实验报告⼀实验题⽬: 实现图的遍历算法⼆实验要求:2.1:(1)建⽴如图(p126 8.1)所⽰的有向图 G 的邻接矩阵,并输出之(2)由有向图G的邻接矩阵产⽣邻接表,并输出之(3)再由(2)的邻接表产⽣对应的邻接矩阵,并输出之2.2 (1)输出如图8.1所⽰的有向图G从顶点0开始的深度优先遍历序列(递归算法)(2)输出如图8.1所⽰的有向图G从顶点0开始的深度优先遍历序列(⾮递归算法)(3)输出如图8.1所⽰的有向图G从顶点0开始的⼴度优先遍历序列三实验内容:3.1 图的抽象数据类型:ADT Graph{数据对象V:V是具有相同特性的数据元素的集合,称为顶点集。

数据关系R:R={VR}VR={|v,w∈V且P(v,w),表⽰从v到w的弧,谓词P(v,w)定义了弧的意义或信息}基本操作:CreateGraph( &G, V, VR )初始条件:V是图的顶点集,VR是图中弧的集合。

操作结果:按V和VR的定义构造图G。

DestroyGraph( &G )初始条件:图G存在。

操作结果:销毁图G。

LocateVex( G, u )初始条件:图G存在,u和G中顶点有相同特征。

操作结果:若G中存在顶点u,则返回该顶点在图中位置;否则返回其它信息。

GetVex( G, v )初始条件:图G存在,v是G中某个顶点。

操作结果:返回v的值。

PutVex( &G, v, value )初始条件:图G存在,v是G中某个顶点。

初始条件:图G存在,v是G中某个顶点。

操作结果:返回v的第⼀个邻接顶点。

若顶点在G中没有邻接顶点,则返回“空”。

NextAdjVex( G, v, w )初始条件:图G存在,v是G中某个顶点,w是v的邻接顶点。

操作结果:返回v的(相对于w的)下⼀个邻接顶点。

若w是v 的最后⼀个邻接点,则返回“空”。

InsertVex( &G, v )初始条件:图G存在,v和图中顶点有相同特征。

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

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 20
typedef int Arc_Type;
typedef char VerTex_Type[5];
typedef enum
{
DG, DN, UDG, UDN
}Graph_Kind;
typedef struct ArcCell
{
Arc_Type adj;
//Info_Type *info;
}AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct
{
V erTex_Type vexs[MAX_VERTEX_NUM];
AdjMatrix arcs;
int vertex_num;
int arc_num;
Graph_Kind kind;
}MGraph;
void Init_MGraph( MGraph &G )
{
printf("输入图的定点数:");
scanf("%d", &G.vertex_num );
printf("输入图的边数:");
scanf("%d", &G.arc_num );
printf("输入图的类型(有向图:1 无向图:2 ):");
scanf("%d", &G.kind);
int i, j;
printf("输入节点向量(定点之间用空格隔开):");
for( i=0; i<G.vertex_num; ++i )
scanf("%s", G.vexs[i] );
for( i=0; i<G.vertex_num; ++i )
for( j=0; j<G.vertex_num; ++j )
G.arcs[i][j].adj = 0;
}
int Get_Vertex_Location( MGraph G, VerTex_Type V )
{
int i;
for( i=0; i<G.vertex_num; ++i )
if( strcmp( V, G.vexs[i] ) == 0 )
return i;
exit(0);
}
void Create_MGraph( MGraph &G )
{
Init_MGraph( G );
int i, v1_site, v2_site;
V erTex_Type v1, v2;
printf("输入与弧相关联的顶点(形如v1 - v2):\n");
for( i=0; i<G.arc_num; ++i )
{
scanf("%s %*s %s", v1, v2 );
v1_site = Get_V ertex_Location( G, v1 );
v2_site = Get_V ertex_Location( G, v2 );
switch( G.kind )
{
case 1:
G.arcs[v1_site][v2_site].adj = 1;
break;
case 2:
G.arcs[v1_site][v2_site].adj = G.arcs[v2_site][v1_site].adj = 1;
break;
default:
exit(0);
}
}
}
void Print_Matrix( MGraph G )//邻接矩阵的输出
{
int i, j;
printf("图的邻接矩阵为:\n");
for( i=0; i<G.vertex_num; ++i )
{
for( j=0; j<G.vertex_num; ++j )
printf(" %d", G.arcs[i][j].adj );
printf("\n");
}
}
int main()
{
MGraph G;
Create_MGraph( G );
Print_Matrix( G );
return 0;
}。

相关文档
最新文档