一、图的实现
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.重边与自环的情况
不带权值时,用邻接矩阵存储边数即可;带权值的时候,若问题需要则不得不使用邻接表