• 邻接表


    图的常用储存结构之一。邻接表由表头结点和表结点两部分组成,其中图中每个顶点均对应一个存储在数组中的表头结点。

    http://baike.baidu.com/link?url=356SEBUQpBZT2E2M0Hssd5benLxbyMWd13ZF-DbZi-mvyQEoyssk4eBweeTpfIqZdLN9-g9cTwwqpPVC1WiM5K

    除了克鲁斯卡尔和floyd,像广搜,普里姆,Bellman-Ford,迪杰斯特拉,SPFA,拓扑排序等等,都可以用到图的邻接表形式。

    数据结构书上的邻接表是这样的:

    借用一下这张图

    http://blog.csdn.net/linxinyuluo/article/details/6847851

     1 #include <iostream>
     2 using namespace std;
     3 
     4 #define MaxVertexNum 20
     5 
     6 typedef char VertexType;
     7 
     8 typedef struct node
     9 {
    10           int adjvex;
    11           node* next;
    12 }EdgeNode;
    13 
    14 typedef struct
    15 {
    16           VertexType data;
    17           EdgeNode* firstedge;
    18 }VertexNode,AdjList[MaxVertexNum];
    19 
    20 typedef struct
    21 {
    22           AdjList adjlist;
    23           int n,e;
    24 }ALGraph;
    25 
    26 void CreateG(ALGraph *G)
    27 {
    28           cout<<"Input vex and edge
    ";
    29           cin>>G->n>>G->e;
    30           EdgeNode *p;
    31 
    32           //建立顶点表
    33           for(int i = 0;i<G->n;i++)
    34           {
    35                     cout<<"create vex table "<<i<<endl;
    36                     cin>>G->adjlist[i].data;
    37                     G->adjlist[i].firstedge = NULL;
    38           }
    39 
    40           //建立边表
    41           for(int k = 0;k<G->e;k++)
    42           {
    43                     cout<<"create edge table "<<k<<endl;
    44                     int a,b;
    45                     cin>>a>>b;
    46                     p = new EdgeNode;
    47                     p->adjvex = b;
    48                     p->next = G->adjlist[a].firstedge;
    49                     G->adjlist[a].firstedge  = p;
    50                     p = new EdgeNode;
    51                     p->adjvex = a;
    52                     p->next = G->adjlist[b].firstedge;
    53                     G->adjlist[b].firstedge  = p;
    54           }
    55 }
    56 
    57 int main()
    58 {
    59           ALGraph *G = new ALGraph;
    60           CreateG(G);
    61           for(int i = 0;i<G->n;i++)
    62           {
    63                     cout<<i;
    64                     while(G->adjlist[i].firstedge!=NULL)
    65                     {
    66                               cout<<" -> "<<G->adjlist[i].firstedge->adjvex;
    67                               G->adjlist[i].firstedge = G->adjlist[i].firstedge->next;
    68                     }
    69                     cout<<endl;
    70           }
    71 }

    http://www.cnblogs.com/g0feng/archive/2012/09/18/2690913.html

    数组实现:

    http://bbs.ahalei.com/thread-4612-1-1.html

    思路是先用e[i]保存所有的边,再用pre[i]保存i最后一个边的位置,最后用e[i].next实现跳转

     1 #include <iostream>
     2 using namespace std;
     3 
     4 #define MaxVertexNum 20
     5 
     6 typedef char VertexType;
     7 
     8 typedef struct
     9 {
    10           int to;
    11           int w;
    12           int next;
    13 }Edge;
    14 
    15 Edge e[MaxVertexNum];
    16 int pre[MaxVertexNum];
    17 
    18 void CreateG(int n,int ed)
    19 {
    20           for(int i = 1;i<=n;i++)
    21                     pre[i] = -1;
    22           for(int i = 1;i<=ed;i++)
    23           {
    24                     int from,to,wg;
    25                     cin>>from>>to>>wg;
    26                     e[i].to = to;
    27                     e[i].w = wg;
    28                     e[i].next = pre[from];
    29                     pre[from] = i;
    30           }
    31 }
    32 
    33 int main()
    34 {
    35           cout<<"Input vex and edge
    ";
    36           int n,ed;
    37           cin>>n>>ed;
    38           CreateG(n,ed);
    39           /*now为弧尾结点序号,i为now所发出的边序号,adj为弧头结点序号,w为now-->adj这条边的权值*/
    40           for(int i = 1;i<=n;i++)
    41           {
    42                     for(int j = pre[i]; j != -1; j = e[j].next)
    43                     {
    44                               int adj = e[j].to;
    45                               int w = e[j].w;
    46                               cout<<adj<<" -> "<<i<<" weight: "<<w<<endl;
    47                     }
    48           }
    49           return 0;
    50 }
    51 /*
    52 4 5
    53 1 4 9
    54 4 3 8
    55 1 2 5
    56 2 4 6
    57 1 3 7
    58 */
  • 相关阅读:
    POJ--3164--Command Network【朱刘算法】最小树形图
    金典 SQL笔记(6)
    hdoj1106排序
    linux程序设计——运行SQL语句(第八章)
    iOS-UITextView-文本输入视图的使用
    HDU 5305 Friends(简单DFS)
    Android IntentService全然解析 当Service遇到Handler
    概要设计的要点
    DispatcherTimer
    原型模式
  • 原文地址:https://www.cnblogs.com/qlky/p/4974579.html
Copyright © 2020-2023  润新知