现在在做社交网络影响力传播这块,遇到一个算法需要用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:前向星
邻接表可以存带重边的图的