图的存储结构--邻接矩阵

一、图的存储结构的概述

  一方面,由于图的结构比较复杂,任意两个顶点都可能存在联系,因此无法以数据元素在存储区中的物理位置来表示元素之间的关系,即图没有顺序存储结构,但其可以借助二维数组来表示元素之间的关系,即采用邻接矩阵表示法。

  另一方面,由于图的任意两个顶点都可能存在关系,因此,用链式存储表示图是很自然的事,图的链式存储有多种,有邻接表、十字链表和邻接多重表,应根据实际需要的不同选择不同的存储结构。

二、四种邻接矩阵的c++代码实现

(一)无向无权图的邻接矩阵代码

  1. 设计思路:

          两个顶点之间有边的话,记作1;无边的话,记作0

       2.代码展示:

#include <bits/stdc++.h>
using namespace std;
const int maxn=100;
int mp[maxn][maxn];
int V,E;//记作顶点数为V;边数为E 
int sx,ex;//记作起始点为sx,终点记作ex
int i,j;
int main(){
	cin>>V>>E;
	for(int i=0;i<E;i++){
		cin>>sx>>ex;
		mp[sx][ex]=1;
        mp[ex][sx]=1;
	}
	for(int i=0;i<V;i++){
		for(int j=0;j<V;j++){
			cout<<mp[i][j];
			cout<<" ";
		}
		cout<<endl;
	}
	return 0;
}

(二)有向无权图的邻接矩阵代码

1.设计思路:

在这里十分的简单扽进行设计,只需将一行代码进行注释

2.代码展示:

#include<bits/stdc++.h>
using namespace std;
const int maxn=100;
int mp[maxn][maxn];
int E,V;//V代表的是顶点数,而M代表的是边数 
int sx,ex;//sx代表的是起点,而ex代表的是终点 
int i,j;
int main(){
	cin>>E>>V;
	for(int i=0;i<E;i++){
		cin>>sx>>ex;
		mp[sx][ex]=1;
		//mp[sx][ex]=//将此行代码进行注释
	}
	for(int i=0;i<E;i++){
		for(int j=0;j<E;j++){
			cout<<mp[i][j];
			cout<<" ";
		}
		cout<<endl;
	}
	return 0;
}

(三)无向带权图的邻接矩阵代码

1.设计思路:

若两个顶点之间无线的话,记作为∞,两个定点之间有限的记作两个顶点的权值的大小。

2.代码展示:

#include<bits/stdc++.h>
using namespace std;
const int maxn=100;
int mp[maxn][maxn];
int V,E;//V为顶点的个数,而边的个数
int sx,ex,dis;//sx为起点,ex为终点,dis为两点之间的距离
int i,j;
int main(){
	cin>>E>>V;
	for(int i=0;i<E;i++){
		cin>>sx>>ex>>dis;
		mp[sx][ex]=dis;
		mp[ex][sx]=dis;
	}
	for(int i=0;i<V;i++){
		for(int j=0;j<V;j++){
			if(mp[i][j])  cout<<mp[i][j];
			else cout<<"∞";
			cout<<" ";
		}
		cout<<endl;
	}
	return 0;
}

(四)有向带权图的邻接矩阵代码

1.设计思路:

只需将无向带权图的一行代码删除即可

#include<bits/stdc++.h>
using namespace std;
const int maxn=100;
int mp[maxn][maxn];
int V,E;//V是总的顶点数 ,E是总的边数 
int sx,ex,dis;//sx为起点,ex为终点,dis为两点之间的距离 
int i,j;
int main(){
	cin>>V>>E;
	for(int i=0;i<E;i++){
		cin>>sx>>ex>>dis;
		mp[sx][ex]=dis;
		//mp[ex][sx]=dis; 
	}
	for(int i=0;i<V;i++){
		for(int j=0;j<V;j++){
			if(mp[i][j]) cout<<mp[i][j];
			else cout<<"∞";
			cout<<" "; 
		}
		cout<<endl;
	}
	return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值