小弟求大神解答:图论中的多边图是如何存储的?

现在在做社交网络影响力传播这块,遇到一个算法需要用C++实现,但涉及到了多边图(多重图),
我知道简单图一般用邻接矩阵或邻接表来存储,但是多边图(多重图)用什么数据结构来储存呢,
最好用c++帮我实现以下或者把关键代码发一下,谢谢了!

1.这个是可以正常用邻接表存的2.你也可以用边集数组直接存边

邻接表——动态建表

[cpp] view plain copy

#include<iostream>  
#include<algorithm>  
#include<cstdio>  
#include<cstring>  
using namespace std;  
const int MAXN = 100;  

struct EdgeNode<span style="white-space:pre">     </span>//邻接表节点  
{  
    int to;<span style="white-space:pre">     </span>//终点  
    int w;<span style="white-space:pre">      </span>//权值  
    EdgeNode *next;<span style="white-space:pre"> </span>//指向下一条边的指针  
};  

struct VNode<span style="white-space:pre">        </span>//起点表节点  
{  
    int from;<span style="white-space:pre">       </span>//起点  
    EdgeNode *first;<span style="white-space:pre">    </span>//邻接表头指针  
};  

VNode Adjlist[MAXN];<span style="white-space:pre">    </span>//整个图的邻接表  


int main()  
{  
    int n,m,x,y,w;  
    cin >> n >> m;  
    for(int i = 0; i < m; i++)//读入图  
    {  
        cin >> x >> y >> w;  
        EdgeNode *p = new EdgeNode();  
        p->to = y;  
        p->w = w;  
        p->next = Adjlist[x].first;  
        Adjlist[x].first = p;  
    }  
    cout << endl;  
    for(int i = 1; i <= n; i++)//遍历图  
    {  
        for(EdgeNode *k = Adjlist[i].first; k != NULL; k = k->next)  
            cout << i << ' ' << k->to << ' ' << k->w << endl;  
    }  
    return 0;  
}  

运用五种方式来实现图的存储,以适应不同的情况。

参考:ACM-ICPC程序设计系列——图论及应用

方式1:邻接矩阵

邻接矩阵是表示图的数据结构中最简单也是最常用的一种。

实现:二维数组Map[MAXN][MAXN],Map[i][j]表示点i到点j的距离。

初始化:Map[i][i] = 0,Map[i][j] = INF(i!=j),读入数据Map[i][j] = w。

时间复杂度:初始化O(n^2),建图需要O(m),总时间复杂度O(n^2)。

优缺点:简单直观,可直接查询点i和点j之间是否有边;遍历效率低,不

能存储重编;初始化效率低;大图开销大,适合存储点少的稠密图。

方式2:前向星

邻接表可以存带重边的图的