C++中图的存储

几个简单的概念

无向图,ab两个点之间有一条边,可以从a到b,也可以从b到a,就叫做无向。

有向图,ab两个点之间有一条边,仅允许从a到b或者从b到a,就叫做有向。

带权,从a到b需要付出c的代价。

图的存储方式比较常见的2类,邻接矩阵和邻接表

1、邻接矩阵,用一个数组来记录图的情况。

int mp[111][111];
mp[a][b]=1;          //有向无权 
mp[a][b]=mp[b][a]=1; //无向无权 
mp[a][b]=c;          //有向带权 
mp[a][b]=mp[b][a]=c; //无向带权 

for(int i=1;i<=n;i++){
    if(mp[a][i]){}   //遍历a节点的边
}

2、邻接表,可以细化为借助STL实现的邻接表和前向星,本质上没有区别,只是存储结构稍有不同

比如对于一个4个节点的有向图,其中有边1-2,1-3,1-4, 2-3,2-4,3-4

邻接表存的形式是 

1->2->3->4

2->3->4

3->4

前向星

1->4>3>2

2->4->3

3->4

STL邻接表

struct node{
	int to;    //终点 
	int v;     //权 
}rt;
vector<node>v[maxn];
void add(int a,int b,int c){  //从a到b有一条权c的边 
	rt.to=b,rt.c=v;
	v[a].push_back(rt);
}
void vis(int a){
	for(int i=0;i<v[a].size();i++){ //遍历a节点的边
	
	}
}

前向星

struct node{
	int to;    //终点 
	int v;     //权 
	int next;  //某条边的前一条边的下标 
}a[maxm*2];    //如果是无向图需要将边数*2 
int head[maxn],cnt=0;//某个节点最后一条边的下标 
void init(){
	memset(head,-1,sizof(head));
}
void add(int a,int b,int c){  //从a到b有一条权c的边 
	a[cnt].to=b;
	a[cnt].next=head[a];      
	head[a]=cnt++;
}
void vis(int a){               //遍历a节点的边 
	for(int i=head[a];i!=-1;i=a[i].next){
	
	}
}

邻接矩阵适合处理点少边多

邻接表适合处理点多边少

猜你喜欢

转载自blog.csdn.net/u011737864/article/details/81410638