导航
resize和reserve的差别:https://blog.csdn.net/Gease_Gg/article/details/83785584
原理
info[i]: 存储起点为i的第一条边在next和to中的下标值。
next[i]: 该点下一条相邻边在next和to中的下标;
to[i]:该边所指向的结点编号;
细致原理参考:https://malash.me/200910/linked-forward-star/
代码
#include <iostream>
#include <vector>
using namespace std;
struct Graph
{
typedef vector<int> VI;
VI info,next,to;
Graph(int n=0,int m=0) : to(0),next(0){
info.resize(n,-1);
next.reserve(m);
to.reserve(m);
}
int edgeSize(){
return to.size();
}
int vertexSize(){
return info.size();
}
void expand(int i){
if(info.size()<i+1)
info.resize(i+1,-1);
}
void add(int i,int j){
expand(i),expand(j);
to.push_back(j);
next.push_back(info[i]);
info[i]=to.size()-1;
}
void delBack(){
int i;
for(i=0;i<info.size();i++){
if(info[i]==to.size()-1){
info[i]=next.back();
break;
}
to.pop_back();
next.pop_back();
}
}
void traverse(){
int size=info.size();
for(int i=0;i<size;i++){
if(info[i]!=-1){
cout<<i<<" ";
for(int j=info[i];j!=-1;j=next[j]){
cout<<to[j]<<" ";
}
cout<<endl;
}
}
}
void clear(){
info.clear();
next.resize(0);
to.resize(0);
}
};
使用
输入边
int main(){
//Graph g(6,4);
Graph g;
g.add(1,2);
g.add(1,5);
g.add(1,4);
g.add(4,5);
g.traverse();
return 0;
}
结果