图的定义
图是由若干给定的点及连接两点的线所构成的图形
图的例子
存图方式
邻接矩阵
优点:简单好写,实现不易出错
缺点:空间复杂度高,达到了O(n2)O(n^2)O(n2)的复杂度,不适用于大部分题
建图代码实现
memset(edge,127,sizeof(edge)); //赋极大值
for(int i=1;i<=m;i++){ //m为边数
cin>>x>>y>>w; //x到y有一条权值为w的边
edge[x][y]=edge[y][x]=w; //存边
}
查找代码实现
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(edge[i][j]<=INF)
cout<<i<<"->"<<j<<": "<<w<<endl
}
}
邻接表
优点:空间小,代码简单,时间较优
缺点:不好理解
建图代码实现
void Add(int x,int y,int z){
nxt[++tot]=first[x];
first[x]=tot;
to[tot]=y;
w[tot]=z;
}
解释
tottottot为边的编号
以上图333号点为例
先连边(3,1,6)(3,1,6)(3,1,6)
所以nxt[1]=first[3]=0nxt[1]=first[3]=0nxt[1]=first[3]=0; //边111的下一条边为000,即不存在
first[3]=1first[3]=1first[3]=1; //以333为端点的第一条边为111
to[1]=1to[1]=1to[1]=1; //第111条边的另一个端点为111
w[1]=6w[1]=6w[1]=6; //第111条边的长度为666
再连边(3,2,3)(3,2,3)(3,2,3)
所以nxt[2]=first[3]=1nxt[2]=first[3]=1nxt[2]=first[3]=1; //边222的下一条边为边111
first[3]=2first[3]=2first[3]=2;
to[2]=2to[2]=2to[2]=2;
w[2]=3w[2]=3w[2]=3;
然后连(3,4,1)(3,4,1)(3,4,1)
nxt[3]=first[3]=2nxt[3]=first[3]=2nxt[3]=first[3]=2;//边333的下一条边为边222
…
查找代码实现
for(int e=first[u];e;e=nxt[e]){
int v=to[e];
cout<<u<<"->"<<v<<": "<<w[e]<<endl;
}
解释
查找点333时
first[3]=4;to[4]=6;first[3]=4; to[4]=6;first[3]=4;to[4]=6;
nxt[4]=3;to[3]=4;nxt[4]=3; to[3]=4;nxt[4]=3;to[3]=4;
nxt[3]=2;to[2]=2;nxt[3]=2; to[2]=2;nxt[3]=2;to[2]=2;
nxt[2]=1;to[1]=1;nxt[2]=1; to[1]=1;nxt[2]=1;to[1]=1;
nxt[1]=0;nxt[1]=0;nxt[1]=0;
不满足eee为真,跳出循环