一、图的实现
1.邻接矩阵
无向图,有向图
int Graph[N][N]={
{0,1,1},
{0,0,1},
{0,1,1},
};
带权值的图(有限值代表右边,无穷大表示无边)
const int INF=1<<30;
int Graph[N][N]={
{0,INF,1},
{INF,0,1},
{0,INF,0},
};
2.邻接表
(1)边的属性较复杂
不带权值的情况:
vector<int> G[num];
void f(int n){
for(int i=1;i<=n;i++){
cin>>s>>t;
//无向图的情况
G[s].push_back(t);
G[t].push_back(i);
//有向图的情况
G[s].push_back(t);
}
}
带权值的情况:
//带权图的情况
struct edge{
int to,cost;
edge(int to,int cost):to(to),cost(cost){}
};
vector<edge> G[num];
void f(int n){
for(int i=1;i<=n;i++){
cin>>s>>t>>val;
//无向图的情况
edge e1(t,val),e2(s,val);
G[s].push_back(e1);
G[s].push_back(e2);
//有向图的情况
edge e(t,val);
G[s].push_back(e);
}
}
(2)顶点的属性较复杂
//换一种思路
struct vertex{
vector<vertex*> edge;
/*
相关的顶点属性
*/
}G[num];
void f(int n){
for(int i=1;i<=n;i++){
cin>>s>>t;
//无向图的情况
G[s].edge.push_back(&G[t]);
G[t].edge.push_back(&G[s]);
//有向图的情况
G[s].edge.push_back(&G[t]);
}
}
3.两者的关系
(1)邻接矩阵:
优点:可以在常数时间内判断两点之间是否有边
缺点:要消耗|V|^2的空间
(2)邻接表:
优点:在边稀少的时候,占用内存较少
缺点:判断两点之间是否有边的时候要遍历一遍,时间复杂度大
4.重边与自环的情况
不带权值时,用邻接矩阵存储边数即可;带权值的时候,若问题需要则不得不使用邻接表