几个简单的概念
无向图,ab两个点之间有一条边,可以从a到b,也可以从b到a,就叫做无向。
有向图,ab两个点之间有一条边,仅允许从a到b或者从b到a,就叫做有向。
带权,从a到b需要付出c的代价。
图的存储方式比较常见的2类,邻接矩阵和邻接表
1、邻接矩阵,用一个数组来记录图的情况。
int mp[111][111];
mp[a][b]=1; //有向无权
mp[a][b]=mp[b][a]=1; //无向无权
mp[a][b]=c; //有向带权
mp[a][b]=mp[b][a]=c; //无向带权
for(int i=1;i<=n;i++){
if(mp[a][i]){} //遍历a节点的边
}
2、邻接表,可以细化为借助STL实现的邻接表和前向星,本质上没有区别,只是存储结构稍有不同
比如对于一个4个节点的有向图,其中有边1-2,1-3,1-4, 2-3,2-4,3-4
邻接表存的形式是
1->2->3->4
2->3->4
3->4
前向星
1->4>3>2
2->4->3
3->4
STL邻接表
struct node{
int to; //终点
int v; //权
}rt;
vector<node>v[maxn];
void add(int a,int b,int c){ //从a到b有一条权c的边
rt.to=b,rt.c=v;
v[a].push_back(rt);
}
void vis(int a){
for(int i=0;i<v[a].size();i++){ //遍历a节点的边
}
}
前向星
struct node{
int to; //终点
int v; //权
int next; //某条边的前一条边的下标
}a[maxm*2]; //如果是无向图需要将边数*2
int head[maxn],cnt=0;//某个节点最后一条边的下标
void init(){
memset(head,-1,sizof(head));
}
void add(int a,int b,int c){ //从a到b有一条权c的边
a[cnt].to=b;
a[cnt].next=head[a];
head[a]=cnt++;
}
void vis(int a){ //遍历a节点的边
for(int i=head[a];i!=-1;i=a[i].next){
}
}
邻接矩阵适合处理点少边多
邻接表适合处理点多边少