在C++中,我们表示图的方法一般都是用链接矩阵或者连接表,这两种表示方法比较常见,但是另外一种用结构体来表示图的方法其实更加简单,而且也很省内存,与连接表法有些类似,但coding起来比较简单。
int tot; //记录当前边的数量
int head[100]; //记录以n为起点的第一条边对应的边e的编号
int flag[100]; //标记某个顶点是否被访问过struct arc{ //边的表示int end; //边的终止节点int next; //同起点的下一条边的编号arc(int x=0,int y=-1){ //结构体构造函数,默认是publicend=x;next=y;}
}e[100]; //边的数组void addE(int u,int v){ //新建一条边,以u为起点,以v为终点e[tot]=arc(v,head[u]); //head[u]为有记录的上一条以u为起点的边的编号head[u]=tot; //更新head[u],head[u]记录的是最近的一条以u为起点的边tot++;
}void visit(int s){printf("%d",s);flag[s]=1;
}void dfs(int s){ //深度优先遍历visit(s);for(int i=head[s];i!=-1;i=e[i].next){if(!flag[e[i].end])dfs(e[i].end);}
}int main(){int u,v;memset(head,-1,sizeof(head)); //初始化以任意一个节点为起点的最近的边的编号为-1memset(flag,0,sizeof(flag)); while(scanf("%d %d",&u,&v)!=EOF){addE(u,v); //建边}dfs(0);return 0;
}
机器数中零的表示形式唯一、
这个代码个邻接表很像,都是通过head[n]来找到一条以n为起点的边,然后根据边中的next来找其他边。但是还是有一点区别的,邻接表中,是按图中逆时针顺序将每一条边加入到节点对应的链表中,而上述表示法是顺时针添加。
理解时最好画一个简单的图来演示一遍更能深刻理解!
图的十字链表、
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态