鱼C论坛

 找回密码
 立即注册
查看: 2900|回复: 0

[学习笔记] 《数据结构与算法》——图

[复制链接]
发表于 2017-8-14 16:51:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 luciferzf 于 2017-8-15 14:03 编辑

图:
1)图是由点的集合和边的集合组成的一个多对多的关系,通常可以表示为G(V,E),其中V是点的集合,E是边的集合,点的集合要求有穷非空
2)简单图:图中不存在顶点到自身的边,并且两个点之间只有一条边
3)无向完全图:任意2个顶点间都存在无向边
4)有向完全图:任意2个顶点间都存在两条方向相反的有向边
5)连通图:图中任意两个点都连通;强连通图则要求任意两个点都存在路径

图的存储结构:
1)我们定义一个一维数组存放顶点,一个二维数组存放边,对于二维数组元素T[a]表示点a和b的关系,若T[a]值为1,表示a和b之间有边,若为0,则无边
2)对于无向图,边的储存数组相当于一个对称矩阵,一个顶点的度等于该顶点在矩阵中对应行的1的个数
3)对于网,储存边的数组中的值不再只是0和1,而是每条边的权,若两个点间不存在边,则定义数组对应元素的值为无穷大(即一个比其他元素值都大的静态值)

邻接表:
首先定义一个顺序表用来存储各个节点,然后利用链表的形式,将各个相邻点在顺序表中的下标依次连接在顺序表里各个点上。对于有向表来说,这样就易于得到点的出度。
十字链表:相比于邻接表,十字链表将出度和入度分开,十字链表的顺序表中的各个点不仅储存了出度的点的下标,还有入度的点的下标,对于有向图,更易于得到入度和出度。
邻接多重表:在边表结构中,我们储存了一条边的两个点的下标,以及分别指向与两个点相邻的另外两条边的指针

  1. #include<cstdio>
  2. #include<cstdlib>
  3. #include<iostream>
  4. using namespace std;
  5. #define N 100

  6. class edgenode
  7. {
  8. public:
  9.         int index;
  10.         edgenode *np=NULL;

  11. };

  12. class node
  13. {
  14. public:
  15.         char data;
  16.         int flag = 0;
  17.         edgenode *np=NULL;
  18. }vertex[N];


  19. void Input()
  20. {
  21.         int T;
  22.         cout << "Input vertex:";
  23.         cin >> T;
  24.         vertex[0].data = T;
  25.         for (int i = 1; i < T+1; i++)
  26.         {
  27.                 cin >> vertex[i].data;
  28.         }
  29.         cout << "Input edges:";
  30.         cin >> T;
  31.         for (int i = 1; i < T+1; i++)
  32.         {
  33.                 int a, b;
  34.                 edgenode *cp = NULL;
  35.                 cin >> a >> b;
  36.                 if (vertex[a].np == NULL)
  37.                 {
  38.                         cp = new edgenode;
  39.                         vertex[a].np = cp;
  40.                 }
  41.                 else
  42.                 {
  43.                         cp = vertex[a].np;
  44.                         while (cp->np != NULL)
  45.                         {
  46.                                 cp = cp->np;
  47.                         }
  48.                         edgenode *p = cp;
  49.                         cp = new edgenode;
  50.                         p->np = cp;
  51.                 }
  52.                 cp->index = b;
  53.         }
  54. }

  55. void research()
  56. {
  57.         int n = vertex[0].data;
  58.         for (int i = 1; i <= n; i++)
  59.         {
  60.                 edgenode *p=vertex[i].np;
  61.                 cout << vertex[i].data << "——>" << vertex[p->index].data;
  62.                 while (p->np != NULL)
  63.                 {
  64.                         p = p->np;
  65.                         cout << "——>" << vertex[p->index].data;
  66.                 }
  67.                 cout << endl;
  68.         }
  69. }

  70. int main()
  71. {
  72.         Input();
  73.         research();
  74.         system("PAUSE");
  75. }
复制代码

评分

参与人数 1鱼币 +3 收起 理由
小甲鱼 + 3

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-25 22:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表