邻接矩阵
简单点来说,就是用一维数组存储点的信息,二维数组(即邻接矩阵)来存储边的关系
给定图G<V,E>,其中V = { v1,v2,v3 …vn }
图的邻接矩阵定义为:
因此只要两个点vi和vj之间存在边,就让mij = 1
struct node
{
char V[10]; // 顶点集
int E[10][10]; // 邻接矩阵
int v,e; // 当前的顶点数和边数
}
关于邻接矩阵存图:
1、复杂度O(n^2),适合于稠密图
2、无向图的邻接矩阵关于矩阵的主对角线对称
3、设图的邻接矩阵为G,那么G^k就是从vi到vj长度为k的路径的数目
邻接表
假设我们有5个结点1、 2、 3、 4、 5
我们给每一个结点建立起一个链表
假设1 2、1 3、 1 5、 2 4、 2 5、 3 4、3 5、4 5之间有边
那么用邻接表表示图就是这样的
1 ->2 ->3 ->5
2 ->4 ->5
3 ->4->5
4 ->5
5 ->1
typedef struct node{
int to;
int len;
struct node *next;
};
struct node *head[1010];
void add(int u,int v){
struct node *p = (node*)malloc(sizeof(node));
p -> to = v;
p -> next = head[u]; // p的指针指向头结点
head[u] = p; // 现在头结点指针指向p
}
int n,m;
int main(){
for(int i=1;i<=1010;i++) head[i] = NULL;
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++){
int u,v;
scanf("%d%d",&u,&v);
add(u,v);
add(v,u); // 无向图
}
for(int i=1;i<=n;i++){ // 链表的遍历
struct node *p = head[i];
while(p != NULL){
printf("%d ",p -> to);
p = p -> next;
}
printf("\n");
}
return 0;
}
用vector容器实现代码会简单一点,记录一个点到其所有与它有边的点即可
vector<int> G[maxn];
int main(){
int n,m; cin >> n >> m;
while(m--){
int u,v;
G[u].push_back(v);
G[v].push_back(u); // 无向图存储
}
return 0;
}
关于邻接表存图:
复杂度O(n+m),适合于稀疏图