邻接矩阵
真的好简单 适用于需要提取边权值的算法
#include <iostream>
using namespace std;
#define MAX_vertex 100
int main(){
int G[MAX_vertex][MAX_vertex];
int n;
puts("请输入节点数n:");
cin>>n;
//初始化矩阵
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
G[i][j] = 0;
}
}
int u,v,w;
for (int i = 0; i < n; ++i) {
cin>>u>>v>>w;
G[u][v] = w;//有向图只写这一行就好了 输入时要注意u、v的顺序
G[v][u] = w;//无向图要写这两行 输入随意就好了
}
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
printf("%-4d",G[i][j]);
}
cout<<endl;
}
return 0;
}
有向图和无向图的区别就是:在存储数据时 邻接矩阵是否对称
邻接链表
#include <iostream>
using namespace std;
#define MAX_vertex 100
struct edge{
int vex;
int weight;
edge * next_edge;
};
struct vertex{
int ind;
int outd;
edge * first_edge;
};
int main(){
vertex G[MAX_vertex] = {0};
for (int i = 0; i < MAX_vertex; ++i) {
G[i].ind = G[i].outd = 0;
G[i].first_edge = NULL;
}
int n;
puts("请输入节点个数n:");
cin>>n;
int m;
puts("请输入边数m:");
cin>>m;
int u,v,w;
for (int i = 0; i < m; ++i) {
cin>>u>>v>>w;
edge * t = new edge;
t->vex = v;
t->weight = w;
t->next_edge = NULL;
//头插入应该就不用解释了吧 链表学好了就没问题
t->next_edge = G[u].first_edge;
G[u].first_edge = t;
}
for (int i = 0; i < m; ++i) {
edge * p = G[u].first_edge;
while (p){
cout<<"v = "<<p->vex;
cout<<"w = "<<p->weight;
p = p->next_edge;
}
cout<<endl;
}
return 0;
}
两个结构体包含的变量
顶点/节点vertex
入度indegree
出度outdegree
(以后在关键路径中会用到的入度和出度)
第一条边first_edge
边edge
边的终点编号vex
边的权值weight
下一条边next_edge
碎碎念:其实,计算机中的存储都是一维的。而矩阵是二维的,是由于这是我们人为endl造成的;哪怕是构成矩阵的二维数组,本质上也是一维的。所以!没有维度,就创造维度!没有机会,就创造机会!这就是人类能生存下去的原因!(中二病??)