树的存储
树的存储
树有很多的存储方法,比如说一种很暴力的方法就是,开一个布尔型的二维数组a,先初始化为0,若节点b和c是连通的,那么a[b][c]=1,a[c][b]=1.
但是上述这种方法的空间复杂度极高,不建议使用。
可以看到,如果用二维数组来存那么会是下面这个样子:
那么那些绿色部分存了0的空间是不是很浪费,在STL中,给我们提供了一种可变数组,就是vector。我们可以开个vector<int> G[100010]的数组vector来存储。那么就不会去存那些0了。
看一下下面这张图。
(这里为了方便理解,没把绿色部分省去,而是补充出来)
其中绿色部分是不占内存的,用vector就可以很好地解决了二维数组空间复杂度过高的问题了,代码实现如下:
#include<vector>
//使用vector要include一下
using namespace std;
vector<int> G[100010];
void addedge(int u,int v){
G[u].push_back(v);
G[v].push_back(u);
}
那么当我们的树得边有权值的时候,只用建立一个结构体就行了,如下:
#include<vector>
using namespace std;
struct node{
int v,w;
//v表示点,w表示边权
node make(int x,int y){
node i;
i.v=x;i.w=y;
return i;
}
};
vector<node> G[100010];
void addedge(int u,int v,int w){
G[u].push_back(node::make(v,w));
G[v].push_back(node::make(u,w));
}
或者可以这样:
#include<vector>
using namespace std;
struct node{
int v,w;
//v表示点,w表示边权
};
node make(int x,int y){
node cur;
cur.v=x;cur.w=y;
return cur;
}
vector<node> G[100010];
void addedge(int u,int v,int w){
G[u].push_back(make(v,w));
G[v].push_back(make(u,w));
}