目录
图的存储方式:
邻接矩阵:
无向图的邻接矩阵是对称的,2是自环
用来计算顶点的入度和出度,入度看行,出度看列
代码实现:
cpp
int G[n][n];
memset(G,0,sizeof(G)); //初始化数组0
G[u][v]=G[v][u]=1;//插入无向边
G[u][v]=1;//插入有向边
邻接表:
当数据中0较多,比较占用内存空间,可以考虑用邻接表
每一行第一列表示的是最外层vector数组的下标
代码实现:
cpp
//用二维动态数组来存储邻接表
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<int>G[11];
int m;
cin>>m;//m条边
for(int i=0;i<m;i++){
int a,b; //从顶点a指向b的边
cin>>a>>b;
G[a].push_back(b);
//G[b].push_back(a);存无向图a与b互换
}
for(int i=1;i<=m;i++){
cout<<i<<" ";
for(int j=0;j<G[i-1].size();j++){
cout<<G[i][j]<<" ";
}cout<<endl;
}
return 0;
}
邻接矩阵邻接表对比:
带权图:
边的权值简称边权
邻接矩阵存储:
邻接表存储(代码实现):
cpp
#include<iostream>
#include<vector>
using namespace std;
struct Node{
int v,w;
};
vector<Node>G[11];//二维动态数组存储
void insert1(int u,int v,int w){
Node temp;
temp.v=v;
temp.w=w;
G[u].push_back(temp);
}
void insert2(int u,int v,int w){
insert1(u,v,w);
//insert1(v,u,w);如果要存无向图
}
void input(){
int m;
cin>>m;//10 假设要存入的边为10
for(int i=0;i<m;i++){
int u,v,w;
cin>>u>>v>>w; //从u指向v的有向边,边权w
insert2(u,v,w);
}
}
void output(){
for(int i=1;i<=10;i++){
for(int j=0;j<G[i].size();j++){
cout<<i<<" "<<G[i][j].v<<" "<<G[i][j].w<<endl;
}
}
}
int main(){
input();
output();
return 0;
}